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

Julian Taylor jtaylor.debian at googlemail.com
Sun Apr 15 16:18:39 UTC 2012


The following commit has been merged in the upstream branch:
commit f163f73dce34f2e7889bf5467363455101bbacab
Author: Julian Taylor <jtaylor.debian at googlemail.com>
Date:   Sun Apr 15 16:56:25 2012 +0200

    Imported Upstream version 2.6.0.12051+dfsg

diff --git a/NUnitTests.config b/NUnitTests.config
index 9487c07..92f10d7 100644
--- a/NUnitTests.config
+++ b/NUnitTests.config
@@ -2,56 +2,16 @@
 <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. 
+	 need to create a similar configuration file for your own test project if your
+   application and tests require it.
  -->	 
 
-<!--
-	 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
diff --git a/NUnitTests.nunit b/NUnitTests.nunit
index 8fd6a03..a83d521 100644
--- a/NUnitTests.nunit
+++ b/NUnitTests.nunit
@@ -1,6 +1,6 @@
 <NUnitProject>
-  <Settings activeconfig="Debug" autoconfig="true" />
-  <Config name="Debug" binpath="bin/Debug/lib;bin/Debug/tests;bin/Debug/framework" runtimeFramework="v2.0.50727">
+  <Settings activeconfig="Release" autoconfig="true" processModel="Default" domainUsage="Default" />
+  <Config name="Debug" binpath="bin/Debug/lib;bin/Debug/tests;bin/Debug/framework" runtimeFramework="v0.0">
     <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" />
@@ -9,7 +9,7 @@
     <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" />
+    <assembly path="bin/Debug/tests/nunit-editor.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" />
@@ -20,6 +20,6 @@
     <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" />
+    <assembly path="bin/Release/tests/nunit-editor.tests.dll" />
   </Config>
-</NUnitProject>
\ No newline at end of file
+</NUnitProject>
diff --git a/NUnitTests.v1.nunit b/NUnitTests.v1.nunit
index 786cf23..8dc4ad5 100644
--- a/NUnitTests.v1.nunit
+++ b/NUnitTests.v1.nunit
@@ -6,6 +6,5 @@
     <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
index 5875026..dac96e4 100644
--- a/NUnitTests.v2.nunit
+++ b/NUnitTests.v2.nunit
@@ -9,6 +9,6 @@
     <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" />
+    <assembly path="tests/nunit-editor.tests.dll" />
   </Config>
 </NUnitProject>
diff --git a/doc/actionAttributes.html b/doc/actionAttributes.html
new file mode 100644
index 0000000..db5ff2d
--- /dev/null
+++ b/doc/actionAttributes.html
@@ -0,0 +1,517 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ActionAttributes</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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>Action Attributes (NUnit 2.6)</h2>
+
+<p><b>Action Attributes</b> are a feature of NUnit designed to better enable composability of test logic. Often 
+when writing unit tests we have logic that we want to run upon certain events in the test cycle (e.g. SetUp, 
+TearDown, FixtureSetUp, FixtureTearDown, etc.). NUnit has had the ability to execute code upon these events by 
+decorating fixture classes and methods with the appropriate NUnit- provided attributes. <b>Action Attributes</b>
+allow the user to create custom attributes to encapsulate specific actions for use before or after any test
+is run.
+
+<h3>The Problem of Composability</h3>
+
+<p>Suppose we have some tests in multiple fixtures that need the same in-memory test database to be created and 
+destroyed on each test run. We could create a base fixture class and derive each fixture that depends on the test 
+from that class. Alternatively, we could create a <b>SetUpFixture</b> class at the level of a common namespace
+shared by each fixture. 
+
+<p>This works fine, until we need some other reusable functionality, say the ability to configure or reset a 
+ServiceLocator. We could put that functionality in the base fixture class or setup fixture, but now we're mixing 
+two different responsibilities into the base class. In the case of a setup fixture, this only works if all classes
+requiring both features are located in a common namespace. In some cases we may *not* want the test database, but 
+we do want ServiceLocator configuration; and sometimes we want the opposite. Still other times we'll want both
+ - so we'd have to make the base class configurable.
+
+<p>If we now discover a third piece of functionality we need to reuse, like configuring the Thread's CurrentPrincipal 
+in arbitrary ways, the complexity of the solution very quickly. We've violated the Single Responsibility Principle 
+and are suffering for it. What we really want is the ability to separate the different pieces of resuable test logic 
+and compose them together as our tests need them.
+
+<h3>Resolving the Problem</h3>
+
+<p><b>Action Attributes</b> get us out of our bind. Consider this example:
+
+<div class="code"><pre>
+[TestFixture, ResetServiceLocator]
+public class MyTests
+{
+ [Test, CreateTestDatabase]
+ public void Test1() { /* ... */ }
+
+ [Test, CreateTestDatabase, AsAdministratorPrincipal]
+ public void Test2() { /* ... */ }
+
+ [Test, CreateTestDatabase, AsNamedPrincipal("charlie.poole")]
+ public void Test3() { /* ... */ }
+
+ [Test, AsGuestPrincipal]
+ public void Test4() { /* ... */ }
+}
+</pre></div> 
+
+<p>Here we have used user-defined attributes to identify five different actions
+that we want to compose together in different ways for different tests:
+<ul>
+  <li>ResetServiceLocator
+  <li>CreateTestDatabase
+  <li>AsAdministratorPrincipal
+  <li>AsNamedPrincipal
+  <li>AsGuestPrincipal
+</ul>
+We can reuse these actions in other test fixtures, simply by decorating
+them with the appropriate attributes.without having to inherit from a base class.
+We can even develop and distribute a library of common test actions.
+
+<h3>Implementing an Action Attribute</h3>
+
+<p>Action attributes are defined by the programmer. They implement the <b>ITestAction</b>
+interface, which is defined as follows:
+
+<div class="code"><pre>
+    public interface ITestAction
+    {
+        void BeforeTest(TestDetails details);
+
+        void AfterTest(TestDetails details);
+
+        ActionTargets Targets { get; }
+    }
+</pre></div>
+
+<p>For convenience, you may derive your own action attribute from NUnit's <b>TestActionAttribute</b>,
+an abstract class with virtual implementations of each member of the interface. Alternatively, you
+may derive from <b>System.Attribute</b> and implement the interface directly.
+
+<div class="code"><pre>
+    [Flags]
+    public enum ActionTargets
+    {
+        Default = 0,
+
+        Test = 1,
+
+        Suite = 2
+    }
+</pre></div>
+
+<h4>Action Targets</h4>
+
+<p>The value returned from the <b>Targets</b> property determines when the <b>BeforeTest</b> and
+<b>AfterTest</b> methods will be called. The ActionTargets enum is defined as follows:
+
+<p>When an attribute that returns <b>ActionTargets.Suite</b> is applied to either a class or a parameterized 
+method, NUnit will execute the attribute's <b>BeforeTest</b> method prior to executing the test suite
+and then execute the <b>AfterTest</b> method after the test suite has finished executing. This is similar 
+to how the <b>TestFixtureSetUp</b> and <b>TestFixtureTearDown</b> attributes work.
+
+<p>On the other hand, when an attribute that returns <b>ActionTargets.Test</b> is used in the same
+situations, NUnit will execute the attribute's <b>BeforeTest</b> method prior to each contained
+test case and the <b>AfterTest</b> method after each test case. This is similar to how the <b>SetUp</b>
+and <b>TearDown</b> attributes work.
+
+<p>Action attributes that return <b>ActionTargets.Default</b> target the particular code item to
+which they are attached. When attached to a method, they behave as if <b>ActionTargets.Test</b> had been
+specified. When attached to a class or assembly, they behave as if <b>ActionTargets.Suite</b> was returned.
+
+<h4>Test Details</h4>
+
+The <b>BeforeTest</b> and <b>AfterTest</b> methods are provided with certain information
+about the test that is about to run (before) or has just run (after). The <b>TestDetails</b>
+class provides the following private properties, which may be used by the before or after
+method to decide what actions to take:
+
+<ul>
+<li><b>Fixture</b> - an object representing the user fixture, if available, or null
+<li><b>Method</b> - the MethodInfo that implements the test, if available, or null
+<li><b>FullName</b> - a string giving the full name of the test
+<li><b>Type</b> - a string representing the type of the test, e.g. "Test Case"
+<li><b>IsSuite</b> - true if the test is a suite, otherwise false
+</ul>
+
+<h3>Examples</h3>
+
+<p>The examples that follow all use the following sample Action Attribute:
+
+<div class="code" style="width: 44em"><pre>
+[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class |
+                AttributeTargets.Interface | AttributeTargets.Assembly,
+                AllowMultiple = true)]
+public class ConsoleActionAttribute : Attribute, ITestAction
+{
+    private string _Message;
+
+    public ConsoleActionAttribute(string message) { _Message = message; }
+
+    public void BeforeTest(TestDetails details)
+    {
+        WriteToConsole("Before", details);
+    }
+
+    public void AfterTest(TestDetails details)
+    {
+        WriteToConsole("After", details);
+    }
+
+    public ActionTargets Targets
+    {
+        get { return ActionTargets.Test | ActionTargets.Suite; }
+    }
+
+    private void WriteToConsole(string eventMessage, TestDetails details)
+    {
+        Console.WriteLine("{0} {1}: {2}, from {3}.{4}.",
+            eventMessage,
+            details.IsSuite ? "Suite" : "Case",
+            _Message,
+            fixture != null ? fixture.GetType().Name : "{no fixture}",
+            method != null ? method.Name : "{no method}");
+    }
+}
+</pre></div>
+
+<p>Note that the above Action Attribute returns the union of ActionTargets.Test and 
+   ActionTargets.Suite.
+   This is permitted, but will probably not be the normal case. It is done here so we can
+   reuse the attribute in multiple examples. The attribute takes a single 
+   constructor argument, a message, that will be used to write output to the console. All of
+   the Before and After methods write output via the WriteToConsole method.
+
+<h3>Method Attached Actions</h3>
+
+<h4>Example 1 (applied to simple test method):</h4>
+
+<div class="code"><pre>
+[TestFixture]
+public class ActionAttributeSampleTests
+{
+    [Test][ConsoleAction("Hello")]
+    public void SimpleTest()
+    {
+        Console.WriteLine("Test ran.");
+    }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Test ran.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+</pre>
+
+<h4>Example 2 (applied action twice to test method):</h4>
+
+<div class="code"><pre>
+[TestFixture]
+public class ActionAttributeSampleTests
+{
+    [Test] [ConsoleAction("Hello")]
+    [ConsoleAction("Greetings")]
+    public void SimpleTest()
+    {
+        Console.WriteLine("Test run.");
+    }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Before Case: Greetings, from ActionAttributeSampleTests.SimpleTest.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Test run.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  After Case: Greetings, from ActionAttributeSampleTests.SimpleTest.
+</pre>
+
+<h5>Remarks</h5>
+You are permitted to apply the same attribute multiple times. Note
+that the order in which attributes are applied is indeterminate, although
+it will generally be stable for a single release of .NET.
+
+<h4>Example 3 (applied to a test method with test cases):</h4>
+
+<div class="code"><pre>
+[TestFixture]
+public class ActionAttributeSampleTests
+{
+    [Test] [ConsoleAction("Hello")]
+    [TestCase("02")]
+    [TestCase("01")]
+    public void SimpleTest(string number)
+    {
+        Console.WriteLine("Test run {0}.", number);
+    }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Before Suite: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Test run 01.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Test run 02.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  After Suite: Hello, from ActionAttributeSampleTests.SimpleTest.
+</pre>
+
+<h5>Remarks</h5>
+When one or more [TestCase] attributes are applied to a method, NUnit treats the method as a test suite.  
+You'll notice that BeforeTest was run once before the suite and AfterTest was run once after it.
+In addition, BeforeTest and AfterTest are run again for each individual test case.
+Note that the order in which test cases are executed is indeterminate.
+
+<h3>Type Attached Actions</h3>
+
+<h4>Example 1:</h4>
+
+<div class="code"><pre>
+[TestFixture] [ConsoleAction("Hello")]
+public class ActionAttributeSampleTests
+{
+    [Test]
+    public void SimpleTestOne()
+    {
+        Console.WriteLine("Test One.");
+    }
+    
+    [Test]
+    public void SimpleTestTwo()
+    {
+        Console.WriteLine("Test Two.");
+    }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Before Suite: Hello, from ActionAttributeSampleTests.{no method}.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTestOne.
+  Test ran.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTestOne.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTestTwo.
+  Test ran.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTestTwo.
+  After Suite: Hello, from ActionAttributeSampleTests.{no method}.
+</pre>
+
+<h5>Remarks</h5>
+In this case, the class is the test suite. BeforeTest and AfterTest are run once each for this class and then again for each test.
+
+<h4>Example 2 (attached to interface):</h4>
+
+<div class="code"><pre>
+[ConsoleAction("Hello")]
+public interface IHaveAnAction
+{
+}
+
+[TestFixture]
+public class ActionAttributeSampleTests : IHaveAnAction
+{
+    [Test] 
+    public void SimpleTest()
+    {
+        Console.WriteLine("Test run.");
+    }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Before Suite: Hello, from ActionAttributeSampleTests.{no method}.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Test run.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  After Suite: Hello, from ActionAttributeSampleTests.{no method}.
+</pre>
+
+<h5>Remarks</h5>
+Action attributes can be applied to an interface.  If a class marked with [TestFixture] implements an interface that has an action attribute applied to the interface, the class inherits the action attribute from the interface.  It behaves as if you applied the action attribute to the class itself.
+
+<h4>Example 3 (action attribute is applied to interface and attribute uses interface to provide data to tests):</h4>
+
+<div class="code" style="width: 42em"><pre>
+[AttributeUsage(AttributeTargets.Interface)]
+public class InterfaceAwareActionAttribute : TestActionAttribute
+{
+    private readonly string _Message;
+
+    public InterfaceAwareActionAttribute(string message) { _Message = message; }
+
+    public override void BeforeTest(TestDetails details)
+    {
+        IHaveAnAction obj = details.Fixture as IHaveAnAction;
+        if(obj != null)
+            obj.Message = _Message;
+    }
+
+    public override ActionTargets Target
+    {
+        get { return ActionTargets.Test; }
+    }
+}
+
+[InterfaceAwareAction("Hello")]
+public interface IHaveAnAction { string Message { get; set; } }
+
+[TestFixture]
+public class ActionAttributeSampleTests : IHaveAnAction
+{
+    [Test] 
+    public void SimpleTest()
+    {
+        Console.WriteLine("{0}, World!", Message);
+    }
+
+    public string Message { get; set; }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Hello, World!
+</pre>
+
+<h5>Remarks</h5>
+<p>Here we see a new action attribute, [InterfaceAwareAction].  This attribute uses the Fixture property of the TestDetails passed into BeforeTest and casts it to an interface, IHaveAnAction.  If the fixture implements the IHaveAnAction interface, the attribute sets the Message property to the string passed into the constructor of the attribute.  Since the attribute is applied to the interface, any class that implements this interface gets it's Message property set to the string provided to the constructor of the attribute.  This is useful when the action attribute provides some data or service to the tests.
+
+<p>Note that this attribute inherits from <b>TestActionAttribute</b>. It uses the default (do-nothing) implementation
+   of <b>AfterTest</b> and overrides both <b>BeforeTest</b> and <b>Target</b>.
+
+<h3>Assembly Attached Action</h3>
+
+<h4>Example 1:</h4>
+
+<div class="code"><pre>
+[assembly: ConsoleAction("Hello")]
+
+[TestFixture]
+public class ActionAttributeSampleTests
+{
+    [Test] 
+    public void SimpleTest()
+    {
+        Console.WriteLine("Test run.");
+    }
+}
+</pre></div>
+
+<h5>Console Output:</h5>
+<pre>
+  Before Suite: Hello, from {no fixture}.{no method}.
+  Before Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  Test run.
+  After Case: Hello, from ActionAttributeSampleTests.SimpleTest.
+  After Suite: Hello, from {no fixture}.{no method}.
+</pre>
+
+<h5>Remarks</h5>
+The [ConsoleAction] attribute in this example is applied to the entire assembly.  NUnit treats an assembly as a test suite (in fact, a suite of suites).  Since the [ConsoleAction] attribute implements both ITestSuiteAction and ITestCaseAction, NUnit will run BeforeTest once before any tests are run in the assembly, and AfterTest after all tests are run in the assembly.  Additionally, BeforeTest and AfterTest will be run for every test case in the assembly.  It is unlikely that action attributes are applied to assemblies often.  However, it is useful to build action attributes that ensure state gets cleaned up before and after each tests to prevent individual tests from affecting the outcome of other test.  For example, if you have any static or cached data or services, an action attribute can be used to clean them up for each test.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<ul>
+<li id="current"><a href="actionAttributes.html">Action Attributes</a></li>
+<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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/addinsDialog.html b/doc/addinsDialog.html
index 67634dc..9d1279a 100644
--- a/doc/addinsDialog.html
+++ b/doc/addinsDialog.html
@@ -5,6 +5,7 @@
 <title>NUnit - AddinsDialog</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -62,12 +63,10 @@ and any error message displayed here when that addin is selected.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -80,10 +79,10 @@ and any error message displayed here when that addin is selected.
 <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="projectEditor.html">Project Editor</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>
@@ -95,6 +94,12 @@ and any error message displayed here when that addin is selected.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -102,7 +107,7 @@ and any error message displayed here when that addin is selected.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/assemblyIsolation.html b/doc/assemblyIsolation.html
index 7516370..d99b8bd 100644
--- a/doc/assemblyIsolation.html
+++ b/doc/assemblyIsolation.html
@@ -5,6 +5,7 @@
 <title>NUnit - AssemblyIsolation</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -74,18 +75,17 @@
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -97,6 +97,12 @@
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -104,7 +110,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/assertions.html b/doc/assertions.html
index b6638ba..0065b49 100644
--- a/doc/assertions.html
+++ b/doc/assertions.html
@@ -5,6 +5,7 @@
 <title>NUnit - Assertions</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -65,9 +66,11 @@
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li id="current"><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -82,14 +85,22 @@
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -97,7 +108,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/attributes.html b/doc/attributes.html
index 55456c2..3afbdb9 100644
--- a/doc/attributes.html
+++ b/doc/attributes.html
@@ -5,6 +5,7 @@
 <title>NUnit - Attributes</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -43,13 +44,15 @@
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <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="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -87,12 +90,21 @@
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -100,7 +112,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/category.html b/doc/category.html
index efba2fe..4c8cc4f 100644
--- a/doc/category.html
+++ b/doc/category.html
@@ -5,6 +5,7 @@
 <title>NUnit - Category</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -219,13 +220,15 @@ public void MyTest()
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <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>
@@ -263,12 +266,21 @@ public void MyTest()
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -276,7 +288,7 @@ public void MyTest()
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/collectionAssert.html b/doc/collectionAssert.html
index b10b94c..fee51e6 100644
--- a/doc/collectionAssert.html
+++ b/doc/collectionAssert.html
@@ -5,6 +5,7 @@
 <title>NUnit - CollectionAssert</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -136,9 +137,11 @@ CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -153,14 +156,22 @@ CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -168,7 +179,7 @@ CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/collectionConstraints.html b/doc/collectionConstraints.html
index a2a0696..9473a0a 100644
--- a/doc/collectionConstraints.html
+++ b/doc/collectionConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - CollectionConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -96,6 +97,30 @@ Assert.That( iarray, Has.Some.GreaterThan(2) );
 Assert.That( sarray, Has.Some.Length(1) );
 </pre></div>
 
+<h3>ExactCountConstraint</h3>
+
+<h4>Action</h4>
+<p>Applies a constraint to each item in a collection, succeeding if the specified number of items succeed.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+ExactCountConstraint(int expectedCount, Constraint itemConstraint)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Has.Exactly(int expectedCount)...
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] array = new int[] { 1, 2, 3 };
+
+Assert.That( array, Has.Exactly(1).EqualTo(3) );
+Assert.That( array, Has.Exactly(2).GreaterThan(1) );
+Assert.That( array, Has.Exactly(3).LessThan(100) );
+</pre></div>
+
 <h3>NoItemConstraint</h3>
 
 <h4>Action</h4>
@@ -290,10 +315,13 @@ same modifier is used more than once, the result is undefined.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -311,13 +339,20 @@ same modifier is used more than once, the result is undefined.
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -325,7 +360,7 @@ same modifier is used more than once, the result is undefined.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/combinatorial.html b/doc/combinatorial.html
index c676db6..e6f3f3b 100644
--- a/doc/combinatorial.html
+++ b/doc/combinatorial.html
@@ -5,6 +5,7 @@
 <title>NUnit - Combinatorial</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -61,13 +62,15 @@ public void MyTest(
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <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>
@@ -105,12 +108,21 @@ public void MyTest(
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -118,7 +130,7 @@ public void MyTest(
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/comparisonAsserts.html b/doc/comparisonAsserts.html
index e8e64ed..f12bd1f 100644
--- a/doc/comparisonAsserts.html
+++ b/doc/comparisonAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - ComparisonAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -229,9 +230,11 @@ Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -246,14 +249,22 @@ Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -261,7 +272,7 @@ Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/comparisonConstraints.html b/doc/comparisonConstraints.html
index 742e738..7e12583 100644
--- a/doc/comparisonConstraints.html
+++ b/doc/comparisonConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - ComparisonConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -48,6 +49,7 @@ GreaterThanConstraint(object expected)
 <h4>Syntax</h4>
 <div class="code"><pre>
 Is.GreaterThan(object expected)
+Is.Positive // Equivalent to Is.GreaterThan(0)
 </pre></div>
 
 <h4>Modifiers</h4>
@@ -62,6 +64,7 @@ Is.GreaterThan(object expected)
 Assert.That(7, Is.GreaterThan(3));
 Assert.That(myOwnObject, 
     Is.GreaterThan(theExpected).Using(myComparer));
+Assert.That(42, Is.Positive);
 </pre></div>
 
 <h3>GreaterThanOrEqualConstraint</h3>
@@ -110,6 +113,7 @@ LessThanConstraint(object expected)
 <h4>Syntax</h4>
 <div class="code"><pre>
 Is.LessThan(object expected)
+Is.Negative // Equivalent to Is.LessThan(0)
 </pre></div>
 
 <h4>Modifiers</h4>
@@ -124,6 +128,7 @@ Is.LessThan(object expected)
 Assert.That(3, Is.LessThan(7));
 Assert.That(myOwnObject, 
     Is.LessThan(theExpected).Using(myComparer));
+Assert.That(-5, Is.Negative);
 </pre></div>
 
 <h3>LessThanOrEqualConstraint</h3>
@@ -196,10 +201,13 @@ Assert.That(myOwnObject,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -217,13 +225,20 @@ Assert.That(myOwnObject,
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -231,7 +246,7 @@ Assert.That(myOwnObject,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/compoundConstraints.html b/doc/compoundConstraints.html
index a5aca7d..523af9a 100644
--- a/doc/compoundConstraints.html
+++ b/doc/compoundConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - CompoundConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -53,10 +54,13 @@ Expect( 2.3, GreaterThan( 2.0 ) & LessThan( 3.0 ) );
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -74,13 +78,20 @@ Expect( 2.3, GreaterThan( 2.0 ) & LessThan( 3.0 ) );
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -88,7 +99,7 @@ Expect( 2.3, GreaterThan( 2.0 ) & LessThan( 3.0 ) );
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/conditionAsserts.html b/doc/conditionAsserts.html
index 5ef492c..a81d1c5 100644
--- a/doc/conditionAsserts.html
+++ b/doc/conditionAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - ConditionAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -102,9 +103,11 @@ or a collection.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -119,14 +122,22 @@ or a collection.</p>
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -134,7 +145,7 @@ or a collection.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/conditionConstraints.html b/doc/conditionConstraints.html
index c20893a..9d745f8 100644
--- a/doc/conditionConstraints.html
+++ b/doc/conditionConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - ConditionConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -170,10 +171,13 @@ Assert.That( collection, Is.Unique );
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -191,13 +195,20 @@ Assert.That( collection, Is.Unique );
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -205,7 +216,7 @@ Assert.That( collection, Is.Unique );
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/configEditor.html b/doc/configEditor.html
index e4db3ee..a4992ce 100644
--- a/doc/configEditor.html
+++ b/doc/configEditor.html
@@ -5,6 +5,7 @@
 <title>NUnit - ConfigEditor</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -56,12 +57,10 @@ existing configuration to use as a template.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -74,10 +73,10 @@ existing configuration to use as a template.</p>
 <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="projectEditor.html">Project Editor</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>
@@ -89,6 +88,12 @@ existing configuration to use as a template.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -96,7 +101,7 @@ existing configuration to use as a template.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/configFiles.html b/doc/configFiles.html
index f3f868b..63b8021 100644
--- a/doc/configFiles.html
+++ b/doc/configFiles.html
@@ -5,6 +5,7 @@
 <title>NUnit - ConfigFiles</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -66,74 +67,44 @@ configuration files for each of the assemblies are used.
 <p>Generally, you should be able to simply copy your application config file and rename it as
 described above.</p>
 
-<p>It is also possible to effect the behavior of NUnit by adding special sections
-to the test config file. A config file using these sections might look like this:
-
-<div class="code" style="width: 36em">
-<pre>
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-  <configSections>
-    <sectionGroup name="NUnit">
-      <section name="TestCaseBuilder"
-	    type="System.Configuration.NameValueSectionHandler"/>
-      <section name="TestRunner"
-	    type="System.Configuration.NameValueSectionHandler"/>
-    </sectionGroup>
-  </configSections>
-	
-  <NUnit>
-    <TestCaseBuilder>
-      <add key="OldStyleTestCases" value="false" />
-    </TestCaseBuilder>
-    <TestRunner>
-      <add key="ApartmentState" value="MTA" />
-      <add key="ThreadPriority" value="Normal" />
-	  <add key="DefaultLogThreshold" value="Error" />
-	</TestRunner>
-  </NUnit>
-	
-  ...
-	
-</configuration> 
-</pre>
-</div>
+<p>In versions of NUnit prior to 2.6, it was possible to change the behavior of 
+NUnit by adding special sections to the test config file. This feature is no
+longer supported.
 
-<p>The entries in the above file are all 
-set to default values. The meaning of each setting is as follows:
+<p>The following recommendations are provided in the case of each of the settings
+that are no longer available:
 
 <h4>OldStyleTestCases</h4>
-<p>If set to "true" NUnit will recognize methods beginning 
-"test..." as tests. The prefix is case insensitive.
+<p>NUnit no longer recognizes test methods without attributes.Use <b>TestAttribute</b>.
 
 <h4>ApartmentState</h4>
-<p>Sets the apartment state for the thread used to run tests.
+<p>We recommend the use of <b>RequiresSTAAttribute</b> or <b>RequiresMTAAttribute</b>
+on those test cases, test fixtures or setup fixtures that require a particular apartment.
+As a temporary measure, the nunit-console <b>-apartment</b> option may be used.
 
 <h4>ThreadPriority</h4>
-<p>Sets the thread priority for the test thread.
+<p>This is no longer supported.
 
 <h4>DefaultLogThreshold</h4>
-<p>Sets the level for logging captured by NUnit. In the
-current version only log4net logging is captured, so the
-level must be one that is defined by log4net.
+<p>This is now controlled by a setting in the NUnit Gui runner.
+
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -145,6 +116,12 @@ level must be one that is defined by log4net.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -152,7 +129,7 @@ level must be one that is defined by log4net.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/consoleCommandLine.html b/doc/consoleCommandLine.html
index eb600f9..cffe19a 100644
--- a/doc/consoleCommandLine.html
+++ b/doc/consoleCommandLine.html
@@ -5,6 +5,7 @@
 <title>NUnit - ConsoleCommandLine</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -24,10 +25,10 @@
 
 <div id="content">
 
-<h2>NUnit-Console Command Line Options</h2>
+<h1>NUnit-Console Command Line Options</h1>
 <p>The console interface has a few additional options compared to the forms 
 	interface. The command line must always specify one or more file names. The 
-	console interface always creates an XML representation of the test results. 
+	console interface normally creates an XML representation of the test results. 
 	This file by default is called TestResult.xml and is placed in the working 
 	directory.</p>
 <p><b>Note:</b> By default the nunit-console program is not added to your path. You 
@@ -36,7 +37,11 @@
     a forward slash or a hyphen. Under Linux, a hyphen must be used. Options that
 	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>
+
+<h2>Specifying Which Tests to Run</h2>
+
+<h3>Specifying an Assembly</h3>
+
 <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>
@@ -47,25 +52,37 @@ the tests contained in the nunit.tests.dll use the following command:</p>
 <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>
 
-<h4>Specifying an Assembly and a Test to be Run</h4>
+<h3>Specifying an Assembly and a Test to be Run</h3>
+
 <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. 
+a namespace containing tests. 
 
 <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
+<p>Unlike the deprecated <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>
 in most cases.
 
-<h4>Specifying an Assembly and a Fixture to be Loaded</h4>
+<h3>Specifying Tests to be Run Using a Separate File</h3>
+
+<p>You may specify a list of tests to be run by creating a separate file listing
+those tests and using the <b>/runlist</b> option:
+<pre class="programtext">        nunit-console /runlist:testlist.txt nunit.tests.dll</pre>
+
+<p>The file 'testlist.txt' should contain the full name of each test, listed one per line.
+Each test named may be a test case, test fixture or a namesspace containing tests. Lines
+with the character '#' in the first column are treated as comments.
+
+<h3>Specifying an Assembly and a Fixture to be Loaded (Deprecated)</h3>
+
 <p>When specifying a fixture, you must give the full name of the test fixture 
 	along with the containing assembly. For example, to load the 
 	NUnit.Tests.AssertionTests in the nunit.tests.dll assembly use the following 
@@ -76,34 +93,38 @@ in most cases.
 	class, a legacy suite (using the Suite property ) or a namespace. If a 
 	namespace is given, then all fixtures under that namespace are loaded.</p>
 <p>This option is provided for backward compatibility. In most cases, you will
-be better served by using the <b>/run</b> option.
+be better served by using the <b>/test</b> option.
 	
-<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>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.
-
-<p>Under NUnit 2.5 and later versions, you may still use either of these approaches, 
-but a simpler method is available.
+<h3>Specifying Multiple Assemblies</h3>
+<p>You may run tests from multiple assemblies in one run using the console 
+	interface even if you have not defined an NUnit test project file. The 
+	following command would run a suite of tests contained in assembly1.dll, 
+	assembly2.dll and assembly3.dll.
+	<pre class="programtext">        nunit-console assembly1.dll assembly2.dll assembly3.dll</pre>
+</p>
+<p><b>Notes:</b> You may specify multiple assemblies, but not multiple NUnit or 
+	Visual Studio projects on the command line. Further, you may not specify an 
+	NUnit or Visual Studio project together with a list of assemblies.</p>
+<p>Beginning with NUnit 2.4, the console loads multiple assemblies specified
+   in this way into separate AppDomains by default. You may provide a separate
+   config file for each assembly. You may override the default by use of the
+   <b>/domain</b> option.
+<p>Beginning with NUnit 2.4, the <b>/fixture</b>
+	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>
 
-<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>
+<h3>Specifying which Configuration to run</h3>
+<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 
+	configuration loaded may be controlled by using the <b>/config</b> switch. The 
+	following will load and run tests for the Release configuration of 
+	nunit.tests.dll.
+	<pre class="programtext">        nunit-console nunit.tests.csproj /config:Release</pre>
 </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.
+<p><b>Note:</b> This option has no effect when loading an assembly directly.</p>
 
-<h4>Specifying Test Categories to Include or Exclude</h4>
+<h3>Specifying Test Categories to Include or Exclude</h3>
 <p>NUnit provides CategoryAttribute for use in marking tests as belonging to 
 	one or more categories. Categories may be included or excluded in a test run 
 	using the <b>/include</b> and <b>/exclude</b> options. The following command 
@@ -121,26 +142,51 @@ separate them.
    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.</p>
    
-<p>Beginning with NUnit 2.4.6, you may use a <b>Category Expression</b> with either
-of these options:
-<dl>
-	<dt>A|B|C
-	<dd>Selects tests having any of the categories A, B or C.
-	<dt>A,B,C
-	<dd>Selects tests having any of the categories A, B or C.
-	<dt>A+B+C
-	<dd>Selects only tests having all three of the categories assigned
-	<dt>A+B|C
-	<dd>Selects tests with both A and B OR with category C.
-	<dt>A+B-C
-	<dd>Selects tests with both A and B but not C.
-	<dt>-A
-	<dd>Selects tests not having category A assigned
-	<dt>A+(B|C)
-	<dd>Selects tests having both category A and either of B or C
+<p>Beginning with NUnit 2.4.6, you may use a <b>Category Expression</b> with
+<b>/include</b> or <b>/exclude</b>. The table shows some examples:
+
+<table class="nunit">
+<tr>
+	<th>Expression</th>
+	<th>Action</th>
+</tr>
+<tr>
+	<td>A|B|C</td>
+	<td>Selects tests having any of the categories A, B or C.</td>
+</tr>
+<tr>
+	<td>A,B,C</td>
+	<td>Selects tests having any of the categories A, B or C.</td>
+</tr>
+<tr>
+	<td>A+B+C</td>
+	<td>Selects only tests having all three of the categories assigned</td>
+</tr>
+<tr>
+	<td>A+B|C</td>
+	<td>Selects tests with both A and B OR with category C.</td>
+</tr>
+<tr>
+	<td>A+B-C</td>
+	<td>Selects tests with both A and B but not C.</td>
+</tr>
+<tr>
+	<td>-A</td>
+	<td>Selects tests not having category A assigned</td>
+</tr>
+<tr>
+	<td>A+(B|C)</td>
+	<td>Selects tests having both category A and either of B or C</td>
+</tr>
+<tr>
+	<td>A+B,C</td>
+	<td>Selects tests having both category A and either of B or C</td>
+</tr>
 </dl>
-<p>The comma operator is equivalent to | but has a higher precendence. Order
-of evaluation is as follows:
+</table>
+
+<p><b>Note:</b> As shown by the last two examples, the comma operator is 
+equivalent to | but has a higher precendence. Order of evaluation is as follows:
 <ol>
 <li>Unary exclusion operator (-)
 <li>High-precendence union operator (,)
@@ -159,65 +205,37 @@ the shell you are using.
 	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>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.
+<h2>Controlling How Tests Are Run</h2>
 
-<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 
-	displayed at the start of each test case.</p>
-<h4>Specifying the XML file name</h4>
-<p>As stated above, the console program always creates an XML representation of the 
-	test results. To change the name of the output file to 
-	"console-test.xml" use the following command line option:
-	<pre class="programtext">        nunit-console /xml:console-test.xml 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>. 
+<h3>Specifying the .NET Framework Version</h3>
 
-<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 
-	configuration loaded may be controlled by using the <b>/config</b> switch. The 
-	following will load and run tests for the Release configuration of 
-	nunit.tests.dll.
-	<pre class="programtext">        nunit-console nunit.tests.csproj /config:Release</pre>
-</p>
-<p><b>Note:</b> This option has no effect when loading an assembly directly.</p>
-<h4>Specifying Multiple Assemblies</h4>
-<p>You may run tests from multiple assemblies in one run using the console 
-	interface even if you have not defined an NUnit test project file. The 
-	following command would run a suite of tests contained in assembly1.dll, 
-	assembly2.dll and assembly3.dll.
-	<pre class="programtext">        nunit-console assembly1.dll assembly2.dll assembly3.dll</pre>
+<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>Prior to NUnit 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.
+
+<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>/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>Notes:</b> You may specify multiple assemblies, but not multiple NUnit or 
-	Visual Studio projects on the command line. Further, you may not specify an 
-	NUnit or Visual Studio project together with a list of assemblies.</p>
-<p>Beginning with NUnit 2.4, the console loads multiple assemblies specified
-   in this way into separate AppDomains by default. You may provide a separate
-   config file for each assembly. You may override the default by use of the
-   <b>/domain</b> option.
-<p>Beginning with NUnit 2.4, the <b>/fixture</b>
-	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>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.
+
+<p><b>Note:</b> This option is not available using the .NET 1.1 build of nunit-console.</p>
+
+<h3>Controlling the Use of Processes</h3>
 <p>The <b>/process</b> option controls how NUnit loads tests in processes. The
    following values are recognized.
    <dl style="margin-left: 2em">
@@ -229,7 +247,9 @@ the shell you are using.
    <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><b>Note:</b> This option is not available using the .NET 1.1 build of nunit-console.</p>
+
+<h3>Controlling the Use of AppDomains</h3>
 <p>The <b>/domain</b> option controls of the creation of AppDomains for running tests.
     The following values are recognized:</p>
 	<dl style="margin-left: 2em">
@@ -244,7 +264,16 @@ the shell you are using.
 <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>
+<h3>Controlling the Apartment in Which Tests Run</h3>
+<p>The <b>/apartment</b> option may be used to specify the ApartmentState (STA or MTA)
+        of the test runner thread. Since the default is MTA, the option is
+        only needed to force execution in the Single Threaded Apartment.
+
+<p><b>Note:</b> If a given test must <b>always</b> run in a particular apartment,
+as is the case with many Gui tests, you should use an attribute on the test rather
+than specifying this option at the command line.
+
+<h3>Specifying a Default Timeout Value</h3>
 <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
@@ -253,7 +282,54 @@ 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>
+<h2>Controlling the Output of a Test Run</h2>
+
+<h3>Redirecting Text Output</h3>
+<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.
+
+<h3>Labeling Text Output</h3>
+<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 
+	displayed at the start of each test case.</p>
+
+<h3>Specifying the XML result file name</h3>
+<p>As stated above, the console program normally creates an XML representation of the 
+	test results. To change the name of the output file to 
+	"console-test.xml" use the following command line option:
+<pre class="programtext">        nunit-console /result:console-test.xml nunit.tests.dll</pre>
+</p>
+<p>The XML output may be entirely eliminated by use of the <b>/noresult</b> option.
+<p><b>Note:</b> For compatibility with earlier releases, NUnit 2.6 also recognizes <b>/xml</b>
+   and <b>/noxml</b> as synonyms for the <b>/result</b> and <b>/noresult</b> options.
+<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>. 
+
+<h3>Specifying a Directory for Output</h3>
+
+<p>By default, all output files are created in the current directory. You may
+change the location for such files by specifying the <b>/work</b> option. For
+example, the following command would cause the TestResult.xml and Output.txt
+files to be created in the results directory.
+
+<pre class="programtext">        nunit-console /work:results /out:Output.txt nunit.tests.dll</pre>
+
+<h2>Miscellaneous Options</h2>
+
 <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.
@@ -261,12 +337,15 @@ may run for any amount of time.
 	provide improved performance.</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>/stoponerror</b> option causes execution of the test run to terminate 
+        immediately on the first test failure or error.</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 
 	transforming it. This is useful when debugging problems with the XML format.</p>
 <p>The <b>/nologo</b> option disables display of the copyright information at the 
 	start of the program.</p>
+<p>The <b>/cleanup</b> option clears the shadow copy cache and exits.</p>
 <p>The <b>/help</b> or <b>/?</b> option displays a brief help message</p>
 
 </div>
@@ -274,12 +353,10 @@ may run for any amount of time.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -289,6 +366,7 @@ may run for any amount of time.
 <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="projectEditor.html">Project Editor</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>
@@ -300,6 +378,12 @@ may run for any amount of time.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -307,7 +391,7 @@ may run for any amount of time.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/constraintModel.html b/doc/constraintModel.html
index c010714..4bfc770 100644
--- a/doc/constraintModel.html
+++ b/doc/constraintModel.html
@@ -5,6 +5,7 @@
 <title>NUnit - ConstraintModel</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -124,10 +125,13 @@ Expect( TestDelegate del, IResolveConstraint constraint );
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li id="current"><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -145,13 +149,20 @@ Expect( TestDelegate del, IResolveConstraint constraint );
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -159,7 +170,7 @@ Expect( TestDelegate del, IResolveConstraint constraint );
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/contextMenu.html b/doc/contextMenu.html
index d796b88..2edd807 100644
--- a/doc/contextMenu.html
+++ b/doc/contextMenu.html
@@ -5,6 +5,7 @@
 <title>NUnit - ContextMenu</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -31,28 +32,15 @@
 <h4>Run</h4>
 <p>Runs the selected test - disabled if a test is running.</p>
 
-<h4>Run All</h4>
-<p>Runs all the tests.</p>
-
-<h4>Run Failed</h4>
-<p>Runs only the tests that failed on the previous run.</p>
+<h4>Show Failed Assumptions</h4>
+<p>Turns on and off the display of cases under a <b>Theory</b> that have failed
+   an assumption (Inconclusive results). This menu item is only displayed for
+   nodes that are part of a Theory.
 
 <h4>Show Checkboxes</h4>
 <p>Turns the display of checkboxes in the tree on or off. The checkboxes may
    be used to select multiple tests for running.</p>
    
-<h4>Expand</h4>
-<p>Expands the selected test node – invisible if the node is expanded or has no children.</p>
-
-<h4>Collapse</h4>
-<p>Collapses the selected test node – invisible if the node is collapsed or has no children.</p>
-
-<h4>Expand All</h4>
-<p>Expands all nodes of the tree.</p>
-
-<h4>Collapse All</h4>
-<p>Collapses all nodes in the tree to the root.</p>
-
 <h4>Load Fixture</h4>
 <p>Reloads only the currently selected fixture or namespace. The fixture,
 once loaded, remains in effect through any subsequent reloads. This generally
@@ -69,12 +57,10 @@ results in substantial reduction in load time.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -87,10 +73,10 @@ results in substantial reduction in load time.</p>
 <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="projectEditor.html">Project Editor</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>
@@ -102,6 +88,12 @@ results in substantial reduction in load time.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -109,7 +101,7 @@ results in substantial reduction in load time.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/culture.html b/doc/culture.html
index 9b403fa..36fe3a7 100644
--- a/doc/culture.html
+++ b/doc/culture.html
@@ -5,6 +5,7 @@
 <title>NUnit - Culture</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -209,13 +210,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <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>
@@ -253,12 +256,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -266,7 +278,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/customConstraints.html b/doc/customConstraints.html
index b9bb25d..794249f 100644
--- a/doc/customConstraints.html
+++ b/doc/customConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - CustomConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -47,7 +48,7 @@ default implementation that may be overridden as needed:
 </div>   
 
 <p>Your derived class should save the actual argument to Matches in the protected
-field actual for later use.
+field <b>actual</b> for later use.
 
 <p>The MessageWriter abstract class is implemented in the framework by
 TextMessageWriter. Examining the source for some of the builtin constraints
@@ -56,23 +57,47 @@ 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...
+<p>Having written a custom constraint class, you can use it directly through its constructor:
+
+<div class="code">
+<pre>Assert.That(myObject, new CustomConstraint());</pre>
+</div>
+
+<p>You may also use it in expressions through NUnit's <b>Matches</b> syntax element:
+<div class="code">
+<pre>Assert.That(myObject, Is.Not.Null.And.Matches(new CustomConstraint());</pre>
+</div>
+
+<p>The direct construction approach is not very convenient or easy to read.
+For its built-in constraints, 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...
+<p>Ideally, that's what you would like to do with the custom constraint as well.
+To accomplish this, two separate steps are required:
+
+<ol>
+
+<li>Provide a static class patterned after NUnit's <b>Is</b> class, with properties
+or methods that constuct your custom constructor. If you like, you can even call it
+<b>Is</b>, provided you place it in your own namespace and avoid any conflicts. This
+allows you to write things like:
 
 <div class="code">
-<pre>MyConstraint myConstraint = new MyConstraint();
-Assert.That( myArray, Has.Some.Matches(myConstraint) );</pre>
+<pre>Assert.That( myObject, Is.Custom(x,y) );</pre>
 </div>
 
+<li>Provide an extension method for NUnit's <b>ConstraintExpression</b>, allowing
+you to write things like:
+
+<div class="code">
+<pre>Assert.That( myList, Is.Not.All.Custom(x,y) );</pre>
+</div>
+
+</ol>
 
 
 </div>
@@ -80,12 +105,10 @@ Assert.That( myArray, Has.Some.Matches(myConstraint) );</pre>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -97,6 +120,12 @@ Assert.That( myArray, Has.Some.Matches(myConstraint) );</pre>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -104,7 +133,7 @@ Assert.That( myArray, Has.Some.Matches(myConstraint) );</pre>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/datapoint.html b/doc/datapoint.html
index d730a34..5d8c373 100644
--- a/doc/datapoint.html
+++ b/doc/datapoint.html
@@ -5,6 +5,7 @@
 <title>NUnit - Datapoint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -78,13 +79,15 @@
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -122,12 +125,21 @@
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -135,7 +147,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/datapointProviders.html b/doc/datapointProviders.html
index 586f503..49b7bf9 100644
--- a/doc/datapointProviders.html
+++ b/doc/datapointProviders.html
@@ -5,6 +5,7 @@
 <title>NUnit - DatapointProviders</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -84,12 +85,10 @@ of a parameterized test method.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -109,6 +108,12 @@ of a parameterized test method.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -116,7 +121,7 @@ of a parameterized test method.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/delayedConstraint.html b/doc/delayedConstraint.html
index c95cbcb..6fae97f 100644
--- a/doc/delayedConstraint.html
+++ b/doc/delayedConstraint.html
@@ -5,6 +5,7 @@
 <title>NUnit - DelayedConstraint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -51,10 +52,13 @@
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -72,13 +76,20 @@
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -86,7 +97,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/description.html b/doc/description.html
index 7f52f8a..542f5ea 100644
--- a/doc/description.html
+++ b/doc/description.html
@@ -5,6 +5,7 @@
 <title>NUnit - Description</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -132,13 +133,15 @@ new applciations. If both are used, the Description attribute takes precedence.<
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -176,12 +179,21 @@ new applciations. If both are used, the Description attribute takes precedence.<
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -189,7 +201,7 @@ new applciations. If both are used, the Description attribute takes precedence.<
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/directoryAssert.html b/doc/directoryAssert.html
index 1db9de5..ad262af 100644
--- a/doc/directoryAssert.html
+++ b/doc/directoryAssert.html
@@ -5,6 +5,7 @@
 <title>NUnit - DirectoryAssert</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -128,9 +129,11 @@ DirectoryAssert.IsNotWithin( string expected, string actual,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -145,14 +148,22 @@ DirectoryAssert.IsNotWithin( string expected, string actual,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -160,7 +171,7 @@ DirectoryAssert.IsNotWithin( string expected, string actual,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/equalConstraint.html b/doc/equalConstraint.html
index 1dd32c1..e841a19 100644
--- a/doc/equalConstraint.html
+++ b/doc/equalConstraint.html
@@ -5,6 +5,7 @@
 <title>NUnit - EqualConstraint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -190,13 +191,34 @@ as the argument to <b>Using</b>.
 Assert.That( myObj1, Is.EqualTo( myObj2 ).Using( myComparer ) );
 </pre></div>
 
+<p>Prior to NUnit 2.6, only one comparer could be used. If multiple
+comparers were specified, all but one was ignored. Beginning with NUnit 2.6,
+multiple generic comparers for different types may be specified. NUnit 
+will use the appropriate comparer for any two types being compared. As a result,
+it is now possible to provide a comparer for an array, a collection type or
+a dictionary. The user-provided comparer will be used directly, bypassing the
+default NUnit logic for array, collection or dictionary equality.
+
+<div class="code"><pre>
+class ListOfIntComparer : IEqualityComparer<List<int>>
+{
+	...
+}
+
+var list1 = new List<int>();
+var list2 = new List<int>();
+var myComparer = new ListOfIntComparer();
+...
+Assert.That( list1, Is.EqualTo(list2).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. 
+<li><p>When checking the equality of user-defined classes, NUnit first examines each class to determine whether it implements <b>IEquatable<T></b>. If either object implements the interface for the type of the other object, then that implementation is used in making the comparison. If neither class implements the appropriate interface, NUnit makes use 
+    of the <b>Equals</b> override on the expected object. If you neglect to either implement <b>IEquatable<T></b> or to
+	override <b>Equals</b>, you can expect failures comparing non-identical objects. 
 	In particular, overriding <b>operator==</b> without overriding <b>Equals</b>
-	has no effect.
+or implementing the interface 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, 
@@ -232,10 +254,13 @@ For a <b>DirectoryInfo</b>, the first-level directory contents are compared.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li id="current"><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -253,13 +278,20 @@ For a <b>DirectoryInfo</b>, the first-level directory contents are compared.
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -267,7 +299,7 @@ For a <b>DirectoryInfo</b>, the first-level directory contents are compared.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/equalityAsserts.html b/doc/equalityAsserts.html
index a65b9ca..27fd530 100644
--- a/doc/equalityAsserts.html
+++ b/doc/equalityAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - EqualityAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -145,9 +146,11 @@ values are tested for exact equality.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li id="current"><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -162,14 +165,22 @@ values are tested for exact equality.
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -177,7 +188,7 @@ values are tested for exact equality.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/eventListeners.html b/doc/eventListeners.html
index f7467bb..87c5047 100644
--- a/doc/eventListeners.html
+++ b/doc/eventListeners.html
@@ -5,6 +5,7 @@
 <title>NUnit - EventListeners</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -65,12 +66,10 @@ that you have no need of.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -90,6 +89,12 @@ that you have no need of.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -97,7 +102,7 @@ that you have no need of.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/exception.html b/doc/exception.html
index 13626d9..a6ea9b0 100644
--- a/doc/exception.html
+++ b/doc/exception.html
@@ -5,6 +5,7 @@
 <title>NUnit - Exception</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -252,13 +253,15 @@ namespace NUnitTests {
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -296,12 +299,21 @@ namespace NUnitTests {
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -309,7 +321,7 @@ namespace NUnitTests {
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/exceptionAsserts.html b/doc/exceptionAsserts.html
index 0a2718c..1b7967d 100644
--- a/doc/exceptionAsserts.html
+++ b/doc/exceptionAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - ExceptionAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -194,9 +195,11 @@ Assert.Catch( code );
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -211,14 +214,22 @@ Assert.Catch( code );
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -226,7 +237,7 @@ Assert.Catch( code );
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/explicit.html b/doc/explicit.html
index 652aadd..4b7cc1d 100644
--- a/doc/explicit.html
+++ b/doc/explicit.html
@@ -5,6 +5,7 @@
 <title>NUnit - Explicit</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -210,13 +211,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -254,12 +257,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -267,7 +279,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/extensibility.html b/doc/extensibility.html
index a8cc9a5..a5d7de0 100644
--- a/doc/extensibility.html
+++ b/doc/extensibility.html
@@ -5,6 +5,7 @@
 <title>NUnit - Extensibility</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -46,12 +47,10 @@ including the GUI.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li id="current"><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -63,6 +62,12 @@ including the GUI.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -70,7 +75,7 @@ including the GUI.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/extensionTips.html b/doc/extensionTips.html
index 3c9b86e..4ca6192 100644
--- a/doc/extensionTips.html
+++ b/doc/extensionTips.html
@@ -5,6 +5,7 @@
 <title>NUnit - ExtensionTips</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -63,12 +64,10 @@ intended to do. Rather, let us know what further extension points you would like
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -80,6 +79,12 @@ intended to do. Rather, let us know what further extension points you would like
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -87,7 +92,7 @@ intended to do. Rather, let us know what further extension points you would like
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/fileAssert.html b/doc/fileAssert.html
index 8a0cab2..b9b7567 100644
--- a/doc/fileAssert.html
+++ b/doc/fileAssert.html
@@ -5,6 +5,7 @@
 <title>NUnit - FileAssert</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -72,9 +73,11 @@ FileAssert.AreNotEqual( string expected, string actual,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -89,14 +92,22 @@ FileAssert.AreNotEqual( string expected, string actual,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -104,7 +115,7 @@ FileAssert.AreNotEqual( string expected, string actual,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/files/Results.xsd b/doc/files/Results.xsd
index 3afb840..3dae552 100644
--- a/doc/files/Results.xsd
+++ b/doc/files/Results.xsd
@@ -1,108 +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>
+<?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/doc/files/TestResult.xml b/doc/files/TestResult.xml
index ef51744..1d151b1 100644
--- a/doc/files/TestResult.xml
+++ b/doc/files/TestResult.xml
@@ -1,30 +1,35 @@
 <?xml version="1.0" encoding="utf-8" standalone="no"?>
 <!--This file represents the results of running a test suite-->
-<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" />
+<test-results name="C:\Program Files\NUnit 2.6\bin\tests\mock-assembly.dll" total="21" errors="1" failures="1" not-run="7" inconclusive="1" ignored="4" skipped="0" invalid="3" date="2012-02-04" time="11:46:05">
+  <environment nunit-version="2.6.0.12035" clr-version="2.0.50727.4963" os-version="Microsoft Windows NT 6.1.7600.0" platform="Win32NT" cwd="C:\Program Files\NUnit 2.6\bin" machine-name="CHARLIE-LAPTOP" user="charlie" user-domain="charlie-laptop" />
   <culture-info current-culture="en-US" current-uiculture="en-US" />
-  <test-suite name="tests\mock-assembly.dll" executed="True" success="False" time="0.125" asserts="0">
+  <test-suite type="Assembly" name="C:\Program Files\NUnit 2.6\bin\tests\mock-assembly.dll" executed="True" result="Failure" success="False" time="0.094" asserts="0">
     <results>
-      <test-suite name="NUnit" executed="True" success="False" time="0.109" asserts="0">
+      <test-suite type="Namespace" name="NUnit" executed="True" result="Failure" success="False" time="0.078" asserts="0">
         <results>
-          <test-suite name="Tests" executed="True" success="False" time="0.109" asserts="0">
+          <test-suite type="Namespace" name="Tests" executed="True" result="Failure" success="False" time="0.078" asserts="0">
             <results>
-              <test-suite name="Assemblies" executed="True" success="False" time="0.109" asserts="0">
+              <test-suite type="Namespace" name="Assemblies" executed="True" result="Failure" success="False" time="0.031" asserts="0">
                 <results>
-                  <test-suite name="MockTestFixture" description="Fake Test Fixture" executed="True" success="False" time="0.109" asserts="0">
+                  <test-suite type="TestFixture" name="MockTestFixture" description="Fake Test Fixture" executed="True" result="Failure" success="False" time="0.031" asserts="0">
                     <categories>
                       <category name="FixtureCategory" />
                     </categories>
                     <results>
-                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.FailingTest" executed="True" success="False" time="0.047" asserts="0">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.FailingTest" executed="True" result="Failure" success="False" time="0.016" 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">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.InconclusiveTest" executed="True" result="Inconclusive" success="False" time="0.000" asserts="0">
+                        <reason>
+                          <message><![CDATA[No valid data]]></message>
+                        </reason>
+                      </test-case>
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest1" description="Mock Test #1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.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" executed="True" result="Success" success="True" time="0.000" asserts="0">
                         <categories>
                           <category name="MockCategory" />
                         </categories>
@@ -32,13 +37,16 @@
                           <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">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest3" executed="True" result="Success" success="True" time="0.016" asserts="0">
                         <categories>
                           <category name="AnotherCategory" />
                           <category name="MockCategory" />
                         </categories>
+                        <reason>
+                          <message><![CDATA[Succeeded!]]></message>
+                        </reason>
                       </test-case>
-                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest4" executed="False">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest4" executed="False" result="Ignored">
                         <categories>
                           <category name="Foo" />
                         </categories>
@@ -46,17 +54,17 @@
                           <message><![CDATA[ignoring this test method for now]]></message>
                         </reason>
                       </test-case>
-                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest5" executed="False">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.MockTest5" executed="False" result="NotRunnable">
                         <reason>
                           <message><![CDATA[Method is not public]]></message>
                         </reason>
                       </test-case>
-                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.NotRunnableTest" executed="False">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.NotRunnableTest" executed="False" result="NotRunnable">
                         <reason>
-                          <message><![CDATA[No arguments provided]]></message>
+                          <message><![CDATA[No arguments were provided]]></message>
                         </reason>
                       </test-case>
-                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.TestWithException" executed="True" success="False" time="0.000" asserts="0">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.TestWithException" executed="True" result="Error" success="False" time="0.000" asserts="0">
                         <failure>
                           <message><![CDATA[System.ApplicationException : Intentional Exception]]></message>
                           <stack-trace><![CDATA[at NUnit.Tests.Assemblies.MockTestFixture.MethodThrowsException()
@@ -64,7 +72,7 @@ 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">
+                      <test-case name="NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties" executed="True" result="Success" success="True" time="0.000" asserts="0">
                         <properties>
                           <property name="Size" value="5" />
                           <property name="TargetMethod" value="SomeClassName" />
@@ -74,54 +82,102 @@ at NUnit.Tests.Assemblies.MockTestFixture.TestWithException()
                   </test-suite>
                 </results>
               </test-suite>
-              <test-suite name="BadFixture" executed="False">
+              <test-suite type="TestFixture" name="BadFixture" executed="False" result="NotRunnable">
                 <reason>
                   <message><![CDATA[No suitable constructor was found]]></message>
                 </reason>
                 <results>
-                  <test-case name="NUnit.Tests.BadFixture.SomeTest" executed="False">
+                  <test-case name="NUnit.Tests.BadFixture.SomeTest" executed="False" result="NotRunnable">
                     <reason>
                       <message><![CDATA[No suitable constructor was found]]></message>
                     </reason>
                   </test-case>
                 </results>
               </test-suite>
-              <test-suite name="IgnoredFixture" executed="False">
+              <test-suite type="TestFixture" name="FixtureWithTestCases" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                <results>
+                  <test-suite type="ParameterizedTest" name="GenericMethod" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                    <results>
+                      <test-case name="NUnit.Tests.FixtureWithTestCases.GenericMethod<Int32>(2,4)" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.FixtureWithTestCases.GenericMethod<Double>(9.2d,11.7d)" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                    </results>
+                  </test-suite>
+                  <test-suite type="ParameterizedTest" name="MethodWithParameters" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                    <results>
+                      <test-case name="NUnit.Tests.FixtureWithTestCases.MethodWithParameters(2,2)" executed="True" result="Success" success="True" time="0.000" asserts="1" />
+                      <test-case name="NUnit.Tests.FixtureWithTestCases.MethodWithParameters(9,11)" executed="True" result="Success" success="True" time="0.000" asserts="1" />
+                    </results>
+                  </test-suite>
+                </results>
+              </test-suite>
+              <test-suite type="GenericFixture" name="GenericFixture<T>" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                <results>
+                  <test-suite type="TestFixture" name="GenericFixture<Double>(11.5d)" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                    <results>
+                      <test-case name="NUnit.Tests.GenericFixture<Double>(11.5d).Test1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.GenericFixture<Double>(11.5d).Test2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                    </results>
+                  </test-suite>
+                  <test-suite type="TestFixture" name="GenericFixture<Int32>(5)" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                    <results>
+                      <test-case name="NUnit.Tests.GenericFixture<Int32>(5).Test1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.GenericFixture<Int32>(5).Test2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                    </results>
+                  </test-suite>
+                </results>
+              </test-suite>
+              <test-suite type="TestFixture" name="IgnoredFixture" executed="False" result="Ignored">
                 <reason>
                   <message><![CDATA[]]></message>
                 </reason>
                 <results>
-                  <test-case name="NUnit.Tests.IgnoredFixture.Test1" executed="False">
+                  <test-case name="NUnit.Tests.IgnoredFixture.Test1" executed="False" result="Ignored">
                     <reason>
                       <message><![CDATA[]]></message>
                     </reason>
                   </test-case>
-                  <test-case name="NUnit.Tests.IgnoredFixture.Test2" executed="False">
+                  <test-case name="NUnit.Tests.IgnoredFixture.Test2" executed="False" result="Ignored">
                     <reason>
                       <message><![CDATA[]]></message>
                     </reason>
                   </test-case>
-                  <test-case name="NUnit.Tests.IgnoredFixture.Test3" executed="False">
+                  <test-case name="NUnit.Tests.IgnoredFixture.Test3" executed="False" result="Ignored">
                     <reason>
                       <message><![CDATA[]]></message>
                     </reason>
                   </test-case>
                 </results>
               </test-suite>
-              <test-suite name="Singletons" executed="True" success="True" time="0.000" asserts="0">
+              <test-suite type="ParameterizedFixture" name="ParameterizedFixture" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                <results>
+                  <test-suite type="TestFixture" name="ParameterizedFixture(42)" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                    <results>
+                      <test-case name="NUnit.Tests.ParameterizedFixture(42).Test1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.ParameterizedFixture(42).Test2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                    </results>
+                  </test-suite>
+                  <test-suite type="TestFixture" name="ParameterizedFixture(5)" executed="True" result="Success" success="True" time="0.000" asserts="0">
+                    <results>
+                      <test-case name="NUnit.Tests.ParameterizedFixture(5).Test1" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.ParameterizedFixture(5).Test2" executed="True" result="Success" success="True" time="0.000" asserts="0" />
+                    </results>
+                  </test-suite>
+                </results>
+              </test-suite>
+              <test-suite type="Namespace" name="Singletons" executed="True" result="Success" success="True" time="0.016" asserts="0">
                 <results>
-                  <test-suite name="OneTestCase" executed="True" success="True" time="0.000" asserts="0">
+                  <test-suite type="TestFixture" name="OneTestCase" executed="True" result="Success" success="True" time="0.016" asserts="0">
                     <results>
-                      <test-case name="NUnit.Tests.Singletons.OneTestCase.TestCase" executed="True" success="True" time="0.000" asserts="0" />
+                      <test-case name="NUnit.Tests.Singletons.OneTestCase.TestCase" executed="True" result="Success" success="True" time="0.000" asserts="0" />
                     </results>
                   </test-suite>
                 </results>
               </test-suite>
-              <test-suite name="TestAssembly" executed="True" success="True" time="0.000" asserts="0">
+              <test-suite type="Namespace" name="TestAssembly" executed="True" result="Success" success="True" time="0.000" asserts="0">
                 <results>
-                  <test-suite name="MockTestFixture" executed="True" success="True" time="0.000" asserts="0">
+                  <test-suite type="TestFixture" name="MockTestFixture" executed="True" result="Success" 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" />
+                      <test-case name="NUnit.Tests.TestAssembly.MockTestFixture.MyTest" executed="True" result="Success" success="True" time="0.000" asserts="0" />
                     </results>
                   </test-suite>
                 </results>
diff --git a/doc/fixtureSetup.html b/doc/fixtureSetup.html
index d8b58c6..2eb6de1 100644
--- a/doc/fixtureSetup.html
+++ b/doc/fixtureSetup.html
@@ -5,6 +5,7 @@
 <title>NUnit - FixtureSetup</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -174,13 +175,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -218,12 +221,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -231,7 +243,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/fixtureTeardown.html b/doc/fixtureTeardown.html
index 96067e9..e684a98 100644
--- a/doc/fixtureTeardown.html
+++ b/doc/fixtureTeardown.html
@@ -5,6 +5,7 @@
 <title>NUnit - FixtureTeardown</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -174,13 +175,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -218,12 +221,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -231,7 +243,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/getStarted.html b/doc/getStarted.html
index 2ab2486..adfd918 100644
--- a/doc/getStarted.html
+++ b/doc/getStarted.html
@@ -5,6 +5,7 @@
 <title>NUnit - GetStarted</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -49,22 +50,26 @@
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -72,7 +77,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/guiCommandLine.html b/doc/guiCommandLine.html
index 3d84ce4..10909f4 100644
--- a/doc/guiCommandLine.html
+++ b/doc/guiCommandLine.html
@@ -5,6 +5,7 @@
 <title>NUnit - GuiCommandLine</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -146,12 +147,10 @@ option:
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -164,10 +163,10 @@ option:
 <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="projectEditor.html">Project Editor</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>
@@ -179,6 +178,12 @@ option:
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -186,7 +191,7 @@ option:
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/identityAsserts.html b/doc/identityAsserts.html
index 0686795..2544729 100644
--- a/doc/identityAsserts.html
+++ b/doc/identityAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - IdentityAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -57,9 +58,11 @@ Assert.Contains( object anObject, IList collection,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -74,14 +77,22 @@ Assert.Contains( object anObject, IList collection,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -89,7 +100,7 @@ Assert.Contains( object anObject, IList collection,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/ignore.html b/doc/ignore.html
index 5dffca8..8f24845 100644
--- a/doc/ignore.html
+++ b/doc/ignore.html
@@ -5,6 +5,7 @@
 <title>NUnit - Ignore</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -203,13 +204,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -247,12 +250,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -260,7 +272,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/img/addinsDialog.jpg b/doc/img/addinsDialog.jpg
index 01e2b15..3b633f5 100644
Binary files a/doc/img/addinsDialog.jpg and b/doc/img/addinsDialog.jpg differ
diff --git a/doc/img/advancedSettings.jpg b/doc/img/advancedSettings.jpg
index 74b83d4..e1738eb 100644
Binary files a/doc/img/advancedSettings.jpg and b/doc/img/advancedSettings.jpg differ
diff --git a/doc/img/assembliesTab.jpg b/doc/img/assembliesTab.jpg
index cb20495..2faf83c 100644
Binary files a/doc/img/assembliesTab.jpg and b/doc/img/assembliesTab.jpg differ
diff --git a/doc/img/assemblyReloadSettings.jpg b/doc/img/assemblyReloadSettings.jpg
index 42f1b0f..0503f7f 100644
Binary files a/doc/img/assemblyReloadSettings.jpg and b/doc/img/assemblyReloadSettings.jpg differ
diff --git a/doc/img/configEditor.jpg b/doc/img/configEditor.jpg
index 81b6f3d..24089a6 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 103cb5d..0bcfa7b 100644
Binary files a/doc/img/console-mock.jpg and b/doc/img/console-mock.jpg differ
diff --git a/doc/img/generalSettings.jpg b/doc/img/generalSettings.jpg
index 8a197e7..e631ae7 100644
Binary files a/doc/img/generalSettings.jpg and b/doc/img/generalSettings.jpg differ
diff --git a/doc/img/generalTab.jpg b/doc/img/generalTab.jpg
index 0e2273c..f49857b 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 88224ce..223ff64 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 d8cbc96..1b8b918 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
index e47d1bb..e7ba055 100644
Binary files a/doc/img/internalTraceSettings.jpg and b/doc/img/internalTraceSettings.jpg differ
diff --git a/doc/img/miniGui.jpg b/doc/img/miniGui.jpg
index 6c5e703..b5862ce 100644
Binary files a/doc/img/miniGui.jpg and b/doc/img/miniGui.jpg differ
diff --git a/doc/img/nunitTestAdapter.png b/doc/img/nunitTestAdapter.png
new file mode 100644
index 0000000..121e244
Binary files /dev/null and b/doc/img/nunitTestAdapter.png differ
diff --git a/doc/img/projectEditorSettings.jpg b/doc/img/projectEditorSettings.jpg
new file mode 100644
index 0000000..2f21fc1
Binary files /dev/null and b/doc/img/projectEditorSettings.jpg differ
diff --git a/doc/img/runtimeSelectionSettings.jpg b/doc/img/runtimeSelectionSettings.jpg
new file mode 100644
index 0000000..ded4991
Binary files /dev/null and b/doc/img/runtimeSelectionSettings.jpg differ
diff --git a/doc/img/testLoadSettings.jpg b/doc/img/testLoadSettings.jpg
index 146325f..e95f95e 100644
Binary files a/doc/img/testLoadSettings.jpg and b/doc/img/testLoadSettings.jpg differ
diff --git a/doc/img/testProperties.jpg b/doc/img/testProperties.jpg
index ad02778..060ce6d 100644
Binary files a/doc/img/testProperties.jpg and b/doc/img/testProperties.jpg differ
diff --git a/doc/img/testResultSettings.jpg b/doc/img/testResultSettings.jpg
index bd3f796..a975b52 100644
Binary files a/doc/img/testResultSettings.jpg and b/doc/img/testResultSettings.jpg differ
diff --git a/doc/img/textOutputSettings.jpg b/doc/img/textOutputSettings.jpg
index df846b9..5428dba 100644
Binary files a/doc/img/textOutputSettings.jpg and b/doc/img/textOutputSettings.jpg differ
diff --git a/doc/img/treeDisplaySettings.jpg b/doc/img/treeDisplaySettings.jpg
index 113c662..8f34ec9 100644
Binary files a/doc/img/treeDisplaySettings.jpg and b/doc/img/treeDisplaySettings.jpg differ
diff --git a/doc/img/visualStudioSettings.jpg b/doc/img/visualStudioSettings.jpg
index 75800c5..c111d63 100644
Binary files a/doc/img/visualStudioSettings.jpg and b/doc/img/visualStudioSettings.jpg differ
diff --git a/doc/img/xmlView.jpg b/doc/img/xmlView.jpg
new file mode 100644
index 0000000..8f70b7d
Binary files /dev/null and b/doc/img/xmlView.jpg differ
diff --git a/doc/index.html b/doc/index.html
index 3b37da3..c2b6223 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -5,6 +5,7 @@
 <title>NUnit - DocHome</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -24,9 +25,9 @@
 
 <div id="content">
 
-<h2>NUnit 2.5.10</h2>
+<h2>NUnit 2.6</h2>
 	
-<p>This documentation covers the NUnit 2.5.10 release, 
+<p>This documentation covers the NUnit 2.6 release, 
    introducing a large set of new features to NUnit, particularly in
    the area of parameterized or data-driven testing.
 
@@ -50,18 +51,22 @@ separately.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li id="current"><a href="index.html">NUnit 2.5.10</a></li>
+<li id="current"><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -69,7 +74,7 @@ separately.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/installation.html b/doc/installation.html
index 7846347..0bc7adc 100644
--- a/doc/installation.html
+++ b/doc/installation.html
@@ -5,6 +5,7 @@
 <title>NUnit - Installation</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -26,73 +27,52 @@
 
 <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.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.
+   <b>C:\Program Files\NUnit 2.6</b> directory. 
+   In the installation directory there are up to three sub-directories, depending
+   on what the user has chosen to install: bin, doc and samples.
+   Source code is no longer provided with the binary installation package but may
+   be downloaded separately.
+
 <h3>Running NUnit</h3>
 <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.
+   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 
-	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 
-	which it takes its name.</p>
-<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.</p>
-<p>See the <a href="configFiles.html">Configuration Files</a> 
-    page for further information on configuration.</p>
-	
 <h3>Installation Verification</h3>
 <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.
+   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>
-<p><b>Note:</b> Although the NUnit installation has been modified to allow non-admin
-    users to install, there are still a large number of tests which can only run
-	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 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 
-	working! This is required since correct handling of a non-communicative user 
-	test is what these tests are all about.</p>
+
 <h3>Additional Tests</h3>
 <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>
+   as data by the verification tests themselves. Failures or not run conditions in 
+   these tests are intentional.</p>
 
 <h3>Manual Installation</h3>
-
 <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.
+   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.
+
+<h3>.NET 1.1 Support</h3>
+<p>NUnit's .NET 1.1 support is packaged as a separate download. It may be installed
+   independently, in which case it provides only a restricted version of the console
+   runner, or as part of the overall NUnit installation. When used together with 
+   the primary NUnit installation, it allows you to run .NET 1.1 tests under the
+   Gui. For complete functionality, install in the same disk location used to
+   install NUnit itself.
 
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
 <ul>
@@ -102,15 +82,19 @@ running the NUnit gui and loading and running NUnitTests.nunit. All tests should
 <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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -118,7 +102,7 @@ running the NUnit gui and loading and running NUnitTests.nunit. All tests should
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/license.html b/doc/license.html
index 03ab709..c6184e9 100644
--- a/doc/license.html
+++ b/doc/license.html
@@ -5,6 +5,7 @@
 <title>NUnit - License</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -26,25 +27,33 @@
 
 <h2>NUnit License</h2>
 
-<p>
-Copyright © 2002-2009 Charlie Poole<br>
+<p><b>
+Copyright © 2002-2012 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 
-	no event will the authors be held liable for any damages arising from the use 
-	of this software.</p>
+Copyright © 2000-2002 Philip A. Craig</b>
+
+<p>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.
+
 <p>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:</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-2009 Charlie Poole or 
+	the following restrictions:
+
+<ol>
+<li>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.
+<br><br>
+    <b>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 
-	misrepresented as being the original software.</p>
-<p>3. This notice may not be removed or altered from any source distribution.</p>
+    Vorontsov or Copyright © 2000-2002 Philip A. Craig</b>
+<br><br>
+<li>Altered source versions must be plainly marked as such, and must not be 
+    misrepresented as being the original software.
+<br><br>
+<li>This notice may not be removed or altered from any source distribution.
+</ol>
 
 <h4>License Note</h4>
 <p>This license is based on <A href="http://www.opensource.org/licenses/zlib-license.html">
@@ -61,18 +70,22 @@ us know</a>.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -80,7 +93,7 @@ us know</a>.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/listMapper.html b/doc/listMapper.html
index 7f00234..0a80d70 100644
--- a/doc/listMapper.html
+++ b/doc/listMapper.html
@@ -5,6 +5,7 @@
 <title>NUnit - ListMapper</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -56,10 +57,13 @@ Expect(Map(strings).Property("Length"), EqualTo(lengths));
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -77,13 +81,20 @@ Expect(Map(strings).Property("Length"), EqualTo(lengths));
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -91,7 +102,7 @@ Expect(Map(strings).Property("Length"), EqualTo(lengths));
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/mainMenu.html b/doc/mainMenu.html
index 5f208d9..8f5950d 100644
--- a/doc/mainMenu.html
+++ b/doc/mainMenu.html
@@ -5,6 +5,7 @@
 <title>NUnit - MainMenu</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -202,14 +203,20 @@ the Run button.</p>
 
 <hr><h3>Tools Menu</h3><hr>
 
+<h4>Test Assemblies...</h4>
+<p>Displays information about loaded test assemblies.</p>
+
 <h4>Save Results as XML…</h4>
 <p>Opens a FileSave Dialog for saving the test results as an XML file.</p>
 
 <h4>Exception Details…</h4>
 <p>Displays detailed information about the last exception.</p>
 
-<h4>Options...</h4>
-<p>Displays the <a href="optionsDialog.html">Options Dialog</a>.</p>
+<h4>Open Log Directory...</h4>
+<p>Opens the directory containing logs.</p>
+
+<h4>Settings...</h4>
+<p>Displays the <a href="settingsDialog.html">Settings Dialog</a>.</p>
 
 <h4>Addins...</h4>
 <p>Displays the <a href="addinsDialog.html">Addins Dialog</a>.</p>
@@ -228,12 +235,10 @@ connect to the NUnit web site.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -246,10 +251,10 @@ connect to the NUnit web site.</p>
 <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="projectEditor.html">Project Editor</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>
@@ -261,6 +266,12 @@ connect to the NUnit web site.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -268,7 +279,7 @@ connect to the NUnit web site.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/maxtime.html b/doc/maxtime.html
index 8acc0ff..69057ef 100644
--- a/doc/maxtime.html
+++ b/doc/maxtime.html
@@ -5,6 +5,7 @@
 <title>NUnit - Maxtime</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -55,13 +56,15 @@ cancel long-running tests, see <a href="timeout.html">TimeoutAttribute</a>.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -99,12 +102,21 @@ cancel long-running tests, see <a href="timeout.html">TimeoutAttribute</a>.
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -112,7 +124,7 @@ cancel long-running tests, see <a href="timeout.html">TimeoutAttribute</a>.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/multiAssembly.html b/doc/multiAssembly.html
index 7f6ac35..87dc0b3 100644
--- a/doc/multiAssembly.html
+++ b/doc/multiAssembly.html
@@ -5,6 +5,7 @@
 <title>NUnit - MultiAssembly</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -97,18 +98,17 @@ 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.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -120,6 +120,12 @@ and the user may need to place the directory containing the unmanaged dll on the
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -127,7 +133,7 @@ and the user may need to place the directory containing the unmanaged dll on the
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit-agent.html b/doc/nunit-agent.html
index 4f97979..7220894 100644
--- a/doc/nunit-agent.html
+++ b/doc/nunit-agent.html
@@ -5,6 +5,7 @@
 <title>NUnit - Nunit-agent</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -59,18 +60,17 @@ or the NUnit settings.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -82,6 +82,12 @@ or the NUnit settings.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -89,7 +95,7 @@ or the NUnit settings.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit-console.html b/doc/nunit-console.html
index d9d8b51..4c03045 100644
--- a/doc/nunit-console.html
+++ b/doc/nunit-console.html
@@ -5,6 +5,7 @@
 <title>NUnit - Nunit-console</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -54,12 +55,10 @@ 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.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li id="current"><a href="nunit-console.html">Console Runner</a></li>
@@ -69,6 +68,7 @@ program, which is built using /platform:x86, when testing 32-bit code on a
 <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="projectEditor.html">Project Editor</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>
@@ -80,6 +80,12 @@ program, which is built using /platform:x86, when testing 32-bit code on a
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -87,7 +93,7 @@ program, which is built using /platform:x86, when testing 32-bit code on a
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit-gui.html b/doc/nunit-gui.html
index ac21aaa..a0f0741 100644
--- a/doc/nunit-gui.html
+++ b/doc/nunit-gui.html
@@ -5,6 +5,7 @@
 <title>NUnit - Nunit-gui</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -50,12 +51,20 @@
 <p>The symbols shown in the tree are actually files in the NUnit bin directory.
    These files are named Success.jpg, Failure.jpg and Ignored.jpg and may be
    modified or replaced by the user.</p>
+
+<p><b>Note:</b> Beginning with NUnit 2.6, tests marked with the <b>IgnoreAttribtute</b> are shown in yellow immediately upon loading. Similarly,
+non-runnable tests (e.g.: wrong argument type) are shown in red at load time.
    
 <h4>Progress Bar</h4>
 <p>The progress bar shows the progress of the test. It is colored according
 to the "worst" result obtained: red if there were any failures, yellow if
 some tests were ignored and green for success.
 
+<h4>Result Summary</h4>
+<p>At the end of the test run, a summary of the results is displayed immediately
+below the progress bar. If the result information does not fit in the space
+available, hovering over it shows the full information.
+
 <h4>Result Tabs</h4>
 <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
@@ -90,12 +99,10 @@ see the documentation for the
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -108,10 +115,10 @@ see the documentation for the
 <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="projectEditor.html">Project Editor</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>
@@ -123,6 +130,12 @@ see the documentation for the
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -130,7 +143,7 @@ see the documentation for the
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/nunit.css b/doc/nunit.css
index 1e01e53..174dbbe 100644
--- a/doc/nunit.css
+++ b/doc/nunit.css
@@ -1,126 +1,126 @@
-/* HTML Elements */
-html, body { margin: 0;  padding: 0; }
-body { font: 90% "Verdana", "Arial", "Helvetica", sans-serif; }
-img { border: none; padding: 0; margin: 0;}
-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;  }
-ul.across { width: 100%; display: block; list-style: none; }
-ul.across li { float: left; display: block; width: 9em }
-
-/* Masthead and Main Menu */
-#header { margin: 0; padding: 0; width: 100%; }
-#header img { border: none; padding: 0; margin: 0;}
-#header #logo { margin: 0; padding: 0; position: absolute; top: 15px; left: 15px}
-#header #nav { min-width: 670px; margin: 25px 0 10px 200px; padding: 15px 0 15px 5px;
-    border-top: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black;
-    white-space: nowrap; }
-/* Hide from IE-mac \*/
-* html #nav { height: 1%; }
-/* End of IE-mac hack */
-
-#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; }
-
-/* Submenu */
-#subnav { position: absolute; top: 100px; left: 76%; background-color: #ffd;
-          width: 24%; margin: 1em 0 0; padding: .25em ; border: solid #ccc;
-          border-width: .1em 0 .1em .1em; }
-#subnav ul { margin: 0; padding: 0; list-style: none; }
-#subnav li{ margin: 0; padding: 2px 0 2px; }
-#subnav a { font: 1em "Times New Roman", Roman, serif; margin: 0; padding: 0 0 0 26px; 
-  		text-transform: uppercase; text-decoration: none; color: #000; white-space: nowrap;
-  		background: url(img/bulletOff.gif) no-repeat 10px 50%; display: block}
-#subnav ul ul a { padding: 0 0 0 46px; background-position: 30px 50%; }
-#subnav ul ul ul a { padding: 0 0 0 66px; background-position: 50px 50%; }
-#subnav ul ul ul ul a { padding: 0 0 0 86px; background-position: 70px 50%; }
-#subnav ul ul ul ul ul a { padding: 0 0 0 106px; background-position: 90px 50%; }
-#subnav li#current a{ background-image: url(img/bulletOn.gif) }
-#subnav li a:hover { background-image: url(img/bulletOn.gif) }
-
-/* Main Content */
-#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; }
-#content ol { max-width: 660px; }
-#content blockquote { max-width: 580px }
-#content div.screenshot { text-align: center; margin: 1em 0; }
-#content div.screenshot-right { text-align: center; float: right; margin: 0 0 0 1em; }
-#content img { padding: 0; margin: 0; border: 0 }
-              
-/* Page Footer */
-#footer { text-align: center; font-size: .8em; color: #444; clear: both;
-          border-top: 2px solid #999; margin: 0 30% 10px 5%; padding: 5px 0 0 0;
-          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; }
-
-table.downloads { margin: 1em 5%; padding: 0; width: 24em; border-collapse: collapse; }
-table.downloads td, table.downloads th { border: 1px solid black; padding: 2px; text-align: left }
-table.downloads th { background: #ccf; font-weight: bold; }
-
-table.platforms { margin: 1em 0; padding: 0; width: 24em; border-collapse: collapse; }
-table.platforms td, table.platforms th { border: 1px solid black; padding: 5px; text-align: center }
-table.platforms th { background: #ccf; font-weight: bold; }
-
-table.constraints { margin: 1em 0; padding: 0; width: auto; border-collapse: collapse; }
-table.constraints td, table.constraints th { border: 1px solid black; padding: 6px; text-align: left }
-table.constraints th { background: #ccf; font-weight: bold; text-align: center }
-
-table.roadmap { margin: 1em 0; padding: 0; width: auto; border-collapse: collapse; }
-table.roadmap td, table.roadmap th { border: 1px solid black; padding: 10px; text-align: left }
-table.roadmap th { background: #eef; font-weight: bold; }
-
-table.extensions { margin: 1em 2%; border-collapse: collapse; width: 96%; }
-table.extensions td, table.extensions th { border: solid black 1px; padding: 6px }
-table.extensions th { background: #bbf; font-weight: bold; text-align: center }
-table.extensions td.label { font-weight: bold; text-align: left; width: 10em }
-
-table.quote { margin-left: 30px; margin-right: 30px; background: #FFFFFF; border: 3px black solid; 
-	font: 1.1em/1.5em "Times New Roman", Roman, serif; font-variant: small-caps; 
-	letter-spacing: .1em; padding: 0 }
-table.quote td { padding: 0 }
-table.quote td.sig { border-left: solid black 1px; padding-left: 15px }
-
-#news { position: absolute; top: 100px; left: 76%; border-left: 1px solid black;
-	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: 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%; }
-div.code div.langFilter { position: absolute; top: -15px; left: 0;}
-div.dropdown { position: absolute; top: 0; left: 14px; padding: 0 10px; width: 20px;
-    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"  ); }
-
-pre, .programText { font-family: "Courier New", Courier, Monospace; color: #000; font-size: 1em }
-
-// The following was needed for IE in quirks mode - probably still needed for IE 5
- div.code div.langFilter { position: absolute; top: -14px; left: -1em; }
-
-// Special handling for absence of max-width in IE
-*/
+/* HTML Elements */
+html, body { margin: 0;  padding: 0; }
+body { font: 90% "Verdana", "Arial", "Helvetica", sans-serif; }
+img { border: none; padding: 0; margin: 0;}
+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;  }
+ul.across { width: 100%; display: block; list-style: none; }
+ul.across li { float: left; display: block; width: 9em }
+
+/* Masthead and Main Menu */
+#header { margin: 0; padding: 0; width: 100%; }
+#header img { border: none; padding: 0; margin: 0;}
+#header #logo { margin: 0; padding: 0; position: absolute; top: 15px; left: 15px}
+#header #nav { min-width: 670px; margin: 25px 0 10px 200px; padding: 15px 0 15px 5px;
+    border-top: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black;
+    white-space: nowrap; }
+/* Hide from IE-mac \*/
+* html #nav { height: 1%; }
+/* End of IE-mac hack */
+
+#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; }
+
+/* Submenu */
+#subnav { position: absolute; top: 100px; left: 76%; background-color: #ffd;
+          width: 24%; margin: 1em 0 0; padding: .25em ; border: solid #ccc;
+          border-width: .1em 0 .1em .1em; }
+#subnav ul { margin: 0; padding: 0; list-style: none; }
+#subnav li{ margin: 0; padding: 2px 0 2px; }
+#subnav a { font: 1em "Times New Roman", Roman, serif; margin: 0; padding: 0 0 0 26px; 
+  		text-transform: uppercase; text-decoration: none; color: #000; white-space: nowrap;
+  		background: url(img/bulletOff.gif) no-repeat 10px 50%; display: block}
+#subnav ul ul a { padding: 0 0 0 46px; background-position: 30px 50%; }
+#subnav ul ul ul a { padding: 0 0 0 66px; background-position: 50px 50%; }
+#subnav ul ul ul ul a { padding: 0 0 0 86px; background-position: 70px 50%; }
+#subnav ul ul ul ul ul a { padding: 0 0 0 106px; background-position: 90px 50%; }
+#subnav li#current a{ background-image: url(img/bulletOn.gif) }
+#subnav li a:hover { background-image: url(img/bulletOn.gif) }
+
+/* Main Content */
+#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; }
+#content ol { max-width: 660px; }
+#content blockquote { max-width: 580px }
+#content div.screenshot { text-align: center; margin: 1em 0; }
+#content div.screenshot-right { text-align: center; float: right; margin: 0 0 0 1em; }
+#content img { padding: 0; margin: 0; border: 0 }
+              
+/* Page Footer */
+#footer { text-align: center; font-size: .8em; color: #444; clear: both;
+          border-top: 2px solid #999; margin: 0 30% 10px 5%; padding: 5px 0 0 0;
+          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; }
+
+table.downloads { margin: 1em 5%; padding: 0; width: 24em; border-collapse: collapse; }
+table.downloads td, table.downloads th { border: 1px solid black; padding: 2px; text-align: left }
+table.downloads th { background: #ccf; font-weight: bold; }
+
+table.platforms { margin: 1em 0; padding: 0; width: 24em; border-collapse: collapse; }
+table.platforms td, table.platforms th { border: 1px solid black; padding: 5px; text-align: center }
+table.platforms th { background: #ccf; font-weight: bold; }
+
+table.constraints { margin: 1em 0; padding: 0; width: auto; border-collapse: collapse; }
+table.constraints td, table.constraints th { border: 1px solid black; padding: 6px; text-align: left }
+table.constraints th { background: #ccf; font-weight: bold; text-align: center }
+
+table.roadmap { margin: 1em 0; padding: 0; width: auto; border-collapse: collapse; }
+table.roadmap td, table.roadmap th { border: 1px solid black; padding: 10px; text-align: left }
+table.roadmap th { background: #eef; font-weight: bold; }
+
+table.extensions { margin: 1em 2%; border-collapse: collapse; width: 96%; }
+table.extensions td, table.extensions th { border: solid black 1px; padding: 6px }
+table.extensions th { background: #bbf; font-weight: bold; text-align: center }
+table.extensions td.label { font-weight: bold; text-align: left; width: 10em }
+
+table.quote { margin-left: 30px; margin-right: 30px; background: #FFFFFF; border: 3px black solid; 
+	font: 1.1em/1.5em "Times New Roman", Roman, serif; font-variant: small-caps; 
+	letter-spacing: .1em; padding: 0 }
+table.quote td { padding: 0 }
+table.quote td.sig { border-left: solid black 1px; padding-left: 15px }
+
+#news { position: absolute; top: 100px; left: 76%; border-left: 1px solid black;
+	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: 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%; }
+div.code div.langFilter { position: absolute; top: -15px; left: 0;}
+div.dropdown { position: absolute; top: 0; left: 14px; padding: 0 10px; width: 20px;
+    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"  ); }
+
+pre, .programText { font-family: "Courier New", Courier, Monospace; color: #000; font-size: 1em }
+
+// The following was needed for IE in quirks mode - probably still needed for IE 5
+ div.code div.langFilter { position: absolute; top: -14px; left: -1em; }
+
+// Special handling for absence of max-width in IE
+*/
diff --git a/doc/nunitAddins.html b/doc/nunitAddins.html
index 4134e0f..fe3dffe 100644
--- a/doc/nunitAddins.html
+++ b/doc/nunitAddins.html
@@ -5,6 +5,7 @@
 <title>NUnit - NunitAddins</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -183,12 +184,10 @@ code of NUnit itself, since NUnit uses the same mechanism internally.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -208,6 +207,12 @@ code of NUnit itself, since NUnit uses the same mechanism internally.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -215,7 +220,7 @@ code of NUnit itself, since NUnit uses the same mechanism internally.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/pairwise.html b/doc/pairwise.html
index 502d603..b3fa744 100644
--- a/doc/pairwise.html
+++ b/doc/pairwise.html
@@ -5,6 +5,7 @@
 <title>NUnit - Pairwise</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -45,13 +46,15 @@ combinatorial approach.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -89,12 +92,21 @@ combinatorial approach.
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -102,7 +114,7 @@ combinatorial approach.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/parameterizedTests.html b/doc/parameterizedTests.html
index 73781e4..80142a1 100644
--- a/doc/parameterizedTests.html
+++ b/doc/parameterizedTests.html
@@ -5,6 +5,7 @@
 <title>NUnit - ParameterizedTests</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -88,13 +89,15 @@ are provided:
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -135,12 +138,21 @@ are provided:
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -148,7 +160,7 @@ are provided:
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/pathConstraints.html b/doc/pathConstraints.html
index 2d5e06f..f9ef55f 100644
--- a/doc/pathConstraints.html
+++ b/doc/pathConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - PathConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -150,10 +151,13 @@ Assert.That( "/folder1/folder2/folder3",
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -171,13 +175,20 @@ Assert.That( "/folder1/folder2/folder3",
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -185,7 +196,7 @@ Assert.That( "/folder1/folder2/folder3",
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/platform.html b/doc/platform.html
index cf73bbe..9f19740 100644
--- a/doc/platform.html
+++ b/doc/platform.html
@@ -5,6 +5,7 @@
 <title>NUnit - Platform</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -227,12 +228,16 @@ public class SuccessTests
 <li>Win2008Server</li>
 <li>Win2008ServerR2</li>
 <li>Windows7</li>
+<li>Win2012Server</li>
+<li>Windows8</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-3.0 (1)</li>
+<li>Net-3.5 (2)</li>
 <li>Net-4.0</li>
 <li>NetCF</li>
 <li>SSCLI</li>
@@ -240,20 +245,35 @@ public class SuccessTests
 <li>Mono</li>
 <li>Mono-1.0</li>
 <li>Mono-2.0</li>
+<li>Mono-3.0 (3)</li>
+<li>Mono-3.5 (4)</li>
 </ul>
 
+<p style="clear: both"/>
+<p><b>Notes:</b></p>
+
+<ol>
+<li>Includes Net-2.0
+<li>Includes Net-2.0 and Net-3.0
+<li>Includes Mono-2.0
+<li>Includes Mono-2.0 and Mono-3.0
+</ol>
+
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -291,12 +311,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -304,7 +333,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/pnunit.html b/doc/pnunit.html
index 256efd5..924e35b 100644
--- a/doc/pnunit.html
+++ b/doc/pnunit.html
@@ -5,6 +5,7 @@
 <title>NUnit - Pnunit</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -62,18 +63,17 @@ may be used through the normal NUnit console or gui runners.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -85,6 +85,12 @@ may be used through the normal NUnit console or gui runners.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -92,7 +98,7 @@ may be used through the normal NUnit console or gui runners.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/projectEditor.html b/doc/projectEditor.html
index 2529963..a79f355 100644
--- a/doc/projectEditor.html
+++ b/doc/projectEditor.html
@@ -5,6 +5,7 @@
 <title>NUnit - ProjectEditor</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -26,12 +27,18 @@
 
 <h2>Project Editor</h2>
 
-<p>The Project Editor is displayed through the Project | Edit menu item and allows creating or
-modifying NUnit test projects. It should be noted that a Test Project is active whenever any tests
-have been loaded, even if no project was explicitly created or referenced. In the case of an
-assembly being loaded, an internal wrapper project is created. This allows the user to change
-settings and save the project directly without needing to perform any extra steps. The editor
-consists of a common area and two tabs, as seen in the image below.</p>
+<p>Beginning with NUnit 2.6, the Project Editor is a separate program, which may be executed
+directly or run through the Project | Edit dropdown menu of the NUnit GUI. The editor now
+provides two main views of the project: a property-oriented view based on the Project Editor
+that was built into earlier versions of the NUnit GUI and an xml view, which allows direct
+editing of the .nunit file.
+
+<h2>Property View</h2>
+
+<p>This view consists of a common area and two tabs, as seen in the image below.</p>
+
+<div class="screenshot-left">
+<img src="img/generalTab.jpg"></div>
 
 <h3>Common Area</h3>
 
@@ -89,9 +96,6 @@ consists of a common area and two tabs, as seen in the image below.</p>
    which allows you to add, delete or rename configs and set the
    active configuration.
 
-<div class="screenshot-left">
-<img src="img/generalTab.jpg"></div>
-
 <h3>General Tab</h3>
 
 <p>The General tab allows setting a number of options pertaining to the selected configuration, all of
@@ -167,33 +171,39 @@ Stuio support is enabled, you may also select and add a VS project.</p>
 <p>This text box displays the full path to the selected assembly. You may edit
 the contents to change the path to the assembly.
 
+<h2>XML View</h2>
+
+<p>This view simply displays the XML from the project file, as seen here. You may
+edit the XML directly.</p>
+
+<div class="screenshot-left">
+<img src="img/xmlView.jpg"></div>
+
+<p><b>Note:</b> In this version of NUnit, the XML editor is somewhat primitive.
+Errors in XML formatting are caught and an error message displayed. However,
+the values of attributes are not validated as they are in the property-based
+view and it is possible to create a project file, which NUnit is unable to
+load. Improvements, including intellisense and better error handling, are
+planned in future versions of the Project Editor.
+
+
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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 id="current"><a href="projectEditor.html">Project Editor</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>
@@ -205,6 +215,12 @@ the contents to change the path to the assembly.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -212,7 +228,7 @@ the contents to change the path to the assembly.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/property.html b/doc/property.html
index 2b946d7..9d38995 100644
--- a/doc/property.html
+++ b/doc/property.html
@@ -5,6 +5,7 @@
 <title>NUnit - Property</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -179,13 +180,15 @@ feature itself for certain attributes. See, for example,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -223,12 +226,21 @@ feature itself for certain attributes. See, for example,
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -236,7 +248,7 @@ feature itself for certain attributes. See, for example,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/propertyConstraint.html b/doc/propertyConstraint.html
index c4442a9..49cceea 100644
--- a/doc/propertyConstraint.html
+++ b/doc/propertyConstraint.html
@@ -5,6 +5,7 @@
 <title>NUnit - PropertyConstraint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -98,10 +99,13 @@ Has.InnerException...
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -119,13 +123,20 @@ Has.InnerException...
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -133,7 +144,7 @@ Has.InnerException...
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/quickStart.html b/doc/quickStart.html
index ad3352d..ac5820a 100644
--- a/doc/quickStart.html
+++ b/doc/quickStart.html
@@ -5,6 +5,7 @@
 <title>NUnit - QuickStart</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -283,22 +284,26 @@ public void TransferWithInsufficientFundsAtomicity()
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -306,7 +311,7 @@ public void TransferWithInsufficientFundsAtomicity()
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/random.html b/doc/random.html
index 66e6d2d..00e1188 100644
--- a/doc/random.html
+++ b/doc/random.html
@@ -5,6 +5,7 @@
 <title>NUnit - Random</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -69,13 +70,15 @@ public void MyTest(
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -113,12 +116,21 @@ public void MyTest(
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -126,7 +138,7 @@ public void MyTest(
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/range.html b/doc/range.html
index a849a7d..c3c2cb0 100644
--- a/doc/range.html
+++ b/doc/range.html
@@ -5,6 +5,7 @@
 <title>NUnit - Range</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -80,13 +81,15 @@ public void MyTest(
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -124,12 +127,21 @@ public void MyTest(
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -137,7 +149,7 @@ public void MyTest(
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/releaseBreakdown.html b/doc/releaseBreakdown.html
new file mode 100644
index 0000000..0dd7da6
--- /dev/null
+++ b/doc/releaseBreakdown.html
@@ -0,0 +1,437 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ReleaseBreakdown</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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>
+
+<div style="max-width:660px;text-align:right">
+<a href="releaseNotes.html">View Combined 2.6 Changes</a>
+</div>
+
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.6 Final Release - Version 2.6.0.12051 - February 20, 2012</h3>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>881715 	Frequent socketexception in nUnit GUI
+<li>881958 	nunit-console-x86 crashes with socketexception
+<li>928018 	Issue with test time print out
+<li>930774 	Adding or Removing a category in the Gui causes an exception
+<li>933800 	NUnit will crash when started and dll from previous project doesn't compile
+</ul>
+
+<h3>NUnit 2.6 Release Candidate - Version 2.6.0.12035 - February 4, 2012</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>The Windows installer is now built using WiX 3.5, upgraded from 2.0.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>The API used to create <b>Action Attributes</b> has been changed from the
+    earlier beta releases. See the docs for more info.
+<li>Visual Basic users may now use <b>Assert.ByVal</b> rather than <b>Assert.That()</b>
+    to avoid errors when the first argument is a property with a non-public setter.
+<li>PlatformAttribute now supports arguments 'Windows8' and 'Windows2012Server'.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>498659 	Registry entries and shortcuts remain after install
+<li>498690 	Assert.That() doesn't like properties with scoped setters
+<li>638289 	Install uses CURRENT_USER instead of LOCAL_MACHINE for AssemblyFoldersEx
+<li>910189 	Eliminate NUnit Configuration Section in config file
+<li>919876 	NUnit.Util.Transform.resources missing from nunit.util.dll
+<li>920472 	CollectionAssert.IsNotEmpty must dispose Enumerator
+<li>922455 	Add Support for Windows 8 and Windows 2012 Server to PlatformAttribute
+<li>924504 	NUnit project files should have an Edit command association with the project editor
+</ul>
+
+<h3>NUnit 2.6 Beta 4 - Version 2.6.0.12017 - January 17, 2012</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>NUnit no longer stores settings in the test configuration file, as it
+    did in earlier versions. Specifically, we no longer recognize or support 
+    OldStyleTestCases, ApartmentState, ThreadPriority or DefaultLogThreshold 
+    in the configuration file. Further details on each of these features are 
+    included in the appropriate sections below.
+<li>The TestRunner interface has been modified. Applications using this
+    interface will need to be modified but general users are not effected.
+<li>The build now uses the NAnt 0.91 final release.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>User-defined equality comparers specified with the <b>Using</b> syntax 
+    element may now be used with arrays and dictionaries. Essentially, this 
+    means that there are no longer any restrictions on the Types for which a 
+    user-defined equality comparer may be specified.
+<li>So-called "old-style" tests, identified by having a name beginning with
+    "Test" are no longer supported in NUnit 2.6.
+<li>Setting a ThreadPriority for the test runner thread is no longer supported
+    under NUnit 2.6.
+</ul>
+
+<h4>Console</h4>
+<ul>
+<li>The following new command-line options are provided:
+  <ul>
+    <li><b>-stoponerror</b> causes execution of the test run to terminate 
+        immediately on the first test failure or error.
+    <li><b>-apartment</b> is used to specify the ApartmentState (STA or MTA)
+        of the test runner thread. Since the default is MTA, the option is
+        only needed to force execution in the Single Threaded Apartment.
+  </ul>
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>A number of new settings are available using the <b>Settings Dialog</b>:
+  <ul>
+  <li>The <b>Tree Display</b> page allows the user to select alternate image sets for 
+      use in the test tree. Additional user-provided image sets may be added if desired.
+  <li>The <b>Text Output</b> page allows setting the threshold for capture and display 
+      of log4net output (previously controlled by the test config file).
+  </ul>
+<li>By default, test Cases under a Theory that fail an assumption are no longer shown in the tree.
+    A context menu item has been added to allow the user to view them.
+<li>The properties dialog has been redesigned to be more compact and readable.
+<li>The context menu for the test tree has been simplified.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>605034 	Log4net not working with NUnit
+<li>708173 	NUnit's logic for comparing arrays - use Comparer<T[]> if it is provided
+<li>719184 	Platformdependency in src/ClientUtilities/util/Services/DomainManager.cs:40
+<li>761579 	Tests using log4net run very slowly
+<li>848713 	Feature request: Add switch for console to break on any test case error
+<li>882192 	Ignored test icon should be more prominent
+<li>885173 	Tests are still executed after cancellation by user
+<li>896615 	Tests can't be run in existing AppDomain
+<li>897289 	Is.Empty constraint has unclear failure message
+<li>899178 	Wrong failure message for parameterized tests that expect exceptions
+<li>902305 	Gui should not normally display Inconclusive test cases for a Theory
+<li>902343 	Gui 'Hide Tests' function no longer works
+<li>903078 	DomainUsage.None setting crashes nunit-gui
+<li>903080 	Test tree context menu needs to be simplified
+<li>904841 	After exiting for timeout the teardown method is not executed
+<li>907270 	Gui enables run when the assembly specified on the command line is not found
+<li>908829 	TestCase attribute does not play well with variadic test functions
+<li>910218 	NUnit should add a trailing separator to the ApplicationBase
+<li>912955 	Project files missing in source code package
+</ul>
+
+<h3>NUnit 2.6 Beta 3 - Version 2.6.0.11340 - December 6, 2011</h3>
+
+<h4>Framework</h4>
+
+<ul>
+<li>The Constraint syntax now supports <b>Is.Positive</b>, which is interpreted
+as greater than zero, and <b>Is.Negative</b>, which is interpreted as less than zero.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>892844 	Not using Mono 4.0 profile under Windows
+<li>892845 	"Mono" is not clearly shown in About box or Test Assemblies dialog
+<li>892847 	Gui offers to load assemblies under a lower CLR version
+<li>893919 	DelayedConstraint fails polling properties on references which are initially null
+<li>893991 	When working directory contains # sign, it is truncated
+<li>898192 	Feature Request: Is.Negative, Is.Positive
+<li>898256 	IEnumerable<T> for Datapoints doesn't work
+<li>898850 	NUnit 2.6 beta 2 crashes on assemblies without tests
+</ul>
+
+<h3>NUnit 2.6 Beta 2 - Version 2.6.0.11324 - November 20, 2011</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>NUnit's executables now use config files that allow smoother running 
+    of mixed assemblies built for .NET 2.0 under .NET 4.0.
+<li>When opening Visual Studio formatted solutions, NUnit now uses the
+    solution configuration by default, resulting in changed behavior from
+    previous releases. The Settings Dialog may be used to revert NUnit to
+    the earlier behavior, which ignored solution configurations.
+<li>Changing the URL to be used for NUnit help through the config file
+    is no longer supported.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li><b>TestCaseAttribute</b> now accepts <b>Explicit</b> and <b>Reason</b> 
+    named parameters.
+<li><b>TestCaseSourceAttribute</b> now accepts a <b>Category</b> named parameter.
+<li><b>TestCaseData</b> now supports marking individual test cases as <b>Explicit</b>.
+<li><b>EqualConstraint</b> now recognizes and uses <b>IEquatable<T></b> if
+    it is implemented on either the actual or the expected value. The interface
+    is used in preference to any override of <b>Object.Equals()</b>, so long as
+    the other argument is of Type T. Note that this applies to all equality tests 
+    performed by NUnit.
+<li>When <b>Assert.Throws()</b> fails due to an exception of the wrong Type being
+    thrown, the error message now includes the Message and Stack Trace from the
+    exception.
+<li>The constraint syntax now supports <b>Has.Exactly(n)...</b> in place of 
+    <b>Has.Some...</b> in order to allow tests over collections that must
+    be satisfied a specific number of times.
+<li>The <b>Using(...)</b> syntactic element may now be repeated multiple
+    times in an expression, so long as each comparer applies to a different
+    Type. NUnit will use the appropriate comparer, depending on the Type
+    of the arguments. Among other things, this allows overriding the default
+    NUnit comparison of collections.
+<li>Documentation is provided for the previously undocumented <b>TestContext</b>. 
+    A new property <b>TestContext.WorkDirectory</b> allows tests to access the
+    name of a directory to be used for file output. This directory may be 
+    specified by use of the <b>/work</b> option of <b>nunit-console</b>.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The test reload functionality in the Gui has been rewritten and simplified so that
+    the same logic is used for all cases where the visual state of the tree is to be
+    recovered. Test results are now found even if changes to the assembly have resulted
+    in the assignment of new ids to the tests.
+<li>The Gui now displays invalid tests in red immediately upon load, without waiting 
+    for the user to run them. Tests marked with the <b>IgnoreAttribute</b> are displayed
+    in yellow immediately as well.
+<li>The directory containing the log files may be opened directly from the Gui by
+    use of a new item on the <b>Tools</b> menu.
+<li>Test summary results are truncated when the window size is too small. The full
+    summary is displayed when hovering over the field.
+<li>A number of new settings are available using the <b>Settings Dialog</b>:
+  <ul>
+  <li>The <b>Project Editor</b> page allows the user to select whether the NUnit 
+      <b>Project Editor</b> or another external program will be used when editing
+      the settings file.
+  <li>The <b>Runtime Selection</b> page allows enabling or disabling automatic
+      detection of the target runtime for each test assembly.
+  <li>The <b>Advanced Loader Settings</b> page now allows specifying the argument to use
+      in calling SetPrincipalPolicy for each test AppDomain.
+  <li>The <b>Visual Studio</b> page now includes a setting that enables or disables
+      the use of solution configs when loading Visual Studio solution files.
+  <li>The <b>Internal Trace</b> page now shows the directory path to which log files
+      will be saved.
+  </ul>
+<li>The location of the settings dialog under the Windows AppData directory has been 
+    changed from Roaming to Local. Users will need to reset their preferences in some cases.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>602761 	nunit-agent hangs after tests complete
+<li>625672 	NUnit GUI bounces to background on reload
+<li>657801 	Help URL should not be in config file
+<li>676560 	Assert.AreEqual does not support IEquatable<T>
+<li>697069 	Feature request: dynamic location for TestResult.xml
+<li>697329 	NUnit tries to test disabled projects
+<li>709062 	"System.ArgumentException : Cannot compare" when the element is a list
+<li>712156 	Tests cannot use AppDomain.SetPrincipalPolicy
+<li>766749 	net-2.0\nunit-console-x86.exe.config should have a startup element and also enable loadFromRemoteSources
+<li>770471 	Assert.IsEmpty does not support IEnumerable
+<li>785460 	Add Category parameter to TestCaseSourceAttribute
+<li>794115 	HashSet incorrectly reported
+<li>800089 	Assert.Throws() hides details of inner AssertionException
+<li>836080 	Log Directory shown incorrectly in settings dialog
+<li>836360 	When size of the Gui window is reduced, test result info may not fit in the field provided
+<li>841894 	UI won't run tests marked Explicit from the context menu
+<li>878376 	Add 'Exactly(n)' to the NUnit constraint syntax
+<li>878899 	Changing logging level has no effect until NUnit is restarted
+<li>878955 	ParameterizedTest not in their parent test-suite when FixtureSetup fails in .xml result file
+<li>881617 	Tests with invalid category attributes should be more visible
+<li>882137 	When no tests are run, higher level suites display as Inconclusive
+<li>882517 	NUnit 2.5.10 doesn't recognize TestFixture if there are only TestCaseSource inside
+<li>883271 	Reload Tests sometimes "loses" tests
+<li>885277 	Exception when project calls for a runtime using only 2 digits
+<li>885604 	Feature request: Explicit named parameter to TestCaseAttribute
+<li>887005 	NUnit.exe ignores categories when using /run option
+<li>890129 	DelayedConstraint doesn't appear to poll properties of objects
+<li>890384 	When font is enlarged, layout of settings pages is incorrect
+<li>891237 	When font is enlarged, gui Test Result disappears and suite name is truncated
+<li>891265 	Add /cleanup to nunit-console.exe
+<li>891326 	Non-runnable and statically ignored tests should disable the Run item on the context menu
+</ul>
+
+<h3>NUnit 2.6 Beta 1 - Version 2.6.0.11240 - August 28, 2011</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>NUnit is now built using .NET 3.5. All NUnit assemblies and most tests
+    target .NET 2.0 but the full set of tests requires 3.5 to execute.
+<li>The build script now supports building from source under .NET 4.0.
+    The script selects either .NET 3.5 or .NET 4.0 to perform the build,
+    depending on what is available.
+<li>NAnt 0.91 alpha2 release is now used for building on Windows. The 0.90
+    release is still used on Linux.
+<li>Support for .NET 1.0 / 1.1 is no longer included in the main distribution
+    for NUnit but is provided as a separate package.
+<li>NUnit Mocks is now deprecated. All classes are now marked as obsolete.
+<li>NUnit now uses the NSubstitute mock framework its own tests. A copy of the 
+    NSubstitute dll is included in the distribution.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>NUnit now supports composable <b>Action Attributes</b>, which allow the 
+    test developer to put reusable test actions into attributes and attach 
+    these actions to suites, tests, and test cases. The actions can run 
+    arbitrary code before and after suites, tests, and test cases execute. 
+    It enables the test developer to build smaller reusable actions and to 
+    compose them in unique ways for each suite, test, or test case.
+    <p><p><b>Note:</b> This feature is experimental and details are likely
+    to change in the final release.
+<li><b>PlatformAttribute</b> accepts "Net-3.0", "Net-3.5", "Mono-3.0" and "Mono-3.5" as arguments. Since these frameworks all
+    use the 2.0 runtime, the semantics of their use is slightly different
+    from other key words. The "3.5" arguments also include "3.0" and "2.0"
+    and the "3.0" arguments include "2.0" in their interpretation.
+<li><b>TestFixtureAttribute</b> now accepts a <b>Category</b> named parameter,
+    allowing individual fixture instances to be included in or excluded from
+    a test run.
+</ul>
+
+<h4>Console</h4>
+
+<ul>
+<li>The .NET 1.1 build of nunit-console no longer supports the <b>-process</b>
+    or <b>-framework</b> option. There is no automatic runtime detection and
+    tests execute under same runtime as the console runner itself. If this
+    functionality is needed when running tests under .NET 1.1, use the standard 
+    console runner to execute the tests in a separate process.
+<li>The following new command-line options are provided:
+  <ul>
+  <li><b>-result</b> is a synonym for <b>-xml</b>, specifying the file to be used for output of the test results in XML form. The <b>-xml</b> option is still recognized but will be removed in a future release.
+  <li><b>-noresult</b> allows supressing the xml result output entirely.
+  <li><b>-work</b> is used to specify the directory to be used for output files. Any relative paths specified with the <b>-output</b>, <b>-err</b> or <b>-result</b> options are resolved using this directory as a base.
+  <li><b>-runlist</b> allows the user to specify a file that contains the names of the tests to be executed rather than listing them directly on the command line.
+  </ul>
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The <b>Project Editor</b> is now a separate program, which may be executed directly 
+    or run through the Project | Edit dropdown menu of the NUnit GUI. The editor 
+    now provides two main views of the project: a property-oriented view based 
+    on the Project Editor that was built into earlier versions of the NUnit GUI 
+    and an xml view, which allows simple editing of the .nunit file.
+</ul>
+
+<h4>PNUnit</h4>
+
+<ul>
+<li>The <b>PNUnit</b> code has been updated using the latest build from the developers
+    at Codice Software and additional examples are provided in the source.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>691129 	Add Category parameter to TestFixture
+<li>692180 	Script should allow building for net-2.0 under 3.5 or 4.0
+<li>701331 	TestFixture attributes on base classes are not ignored
+<li>702734 	Separate packaging of NUnit for .NET 1.1 and 2.0
+<li>711330 	Test-free assembly given failure icon in tree display
+<li>712444 	nunit-console /run don't execute parameterized test-cases (with commas in test-case name)
+<li>726313 	Failure in Assembly level Action attribute causes crash
+<li>728500 	TestDomain should unload the test AppDomain
+<li>735851 	Add detection of 3.0, 3.5 and 4.0 frameworks to PlatformAttribute
+<li>736062 	Deadlock when EventListener performs a Trace call + EventPump synchronisation
+<li>739039 	Add noxml option to console runner
+<li>741402 	Error running .NET 1.1 console tests
+<li>746247 	Add AllowPartiallyTrustedCallersAttribute to nunit.framework assembly
+<li>747581 	Failure in TestFixtureTearDown not reported in console runner
+<li>756843 	Failing assertion does not show non-linear tolerance mode
+<li>787106 	EqualConstraint provides inadequate failure information for IEnumerables
+<li>806198 	nunit console crashes when opening certain projects with common output path
+<li>816863 	System.NullReferenceException 2.6.0.11089
+<li>828739 	Run NUnit tests listed in a file
+</ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
+<ul>
+<li id="current"><a href="releaseBreakdown.html">Release Breakdown</a></li>
+</ul>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/releaseNotes.html b/doc/releaseNotes.html
index bd13e93..954e81a 100644
--- a/doc/releaseNotes.html
+++ b/doc/releaseNotes.html
@@ -1,1398 +1,367 @@
-<!-- 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="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 © 2010 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+<!-- 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">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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>
+
+
+<div style="max-width:660px;text-align:right">
+<a href="releaseBreakdown.html">View Changes Separately for Each 2.6 Pre-Release</a>
+</div>
+
+
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.6 Final Release - Version 2.6.0.12051 - February 20, 2012</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>Support for .NET 1.0 / 1.1 is no longer included in the main distribution
+    for NUnit but is provided as a separate package.
+<li>NUnit's executables now use config files that allow smoother running 
+    of mixed assemblies built for .NET 2.0 under .NET 4.0.
+<li>When opening Visual Studio formatted solutions, NUnit now uses the
+    solution configuration by default, resulting in changed behavior from
+    previous releases. The Settings Dialog may be used to revert NUnit to
+    the earlier behavior, which ignored solution configurations.
+<li>NUnit Mocks is now deprecated. All classes are now marked as obsolete.
+    NUnit now uses the NSubstitute mock framework its own tests. A copy of the 
+    NSubstitute dll is included in the distribution.
+<li>NUnit no longer stores settings in the test configuration file, as it
+    did in earlier versions. Specifically, we no longer recognize or support
+    <ul> 
+    <li>OldStyleTestCases
+    <li>ApartmentState
+    <li>ThreadPriority
+    <li>DefaultLogThreshold
+    </ul>
+<li>Changing the URL to be used for NUnit help through NUnit's config file
+    is no longer supported.
+</ul>
+
+<h4>Development</h4>
+<ul>
+<li>NUnit is now built using .NET 3.5 or higher. All NUnit assemblies and most tests
+    target .NET 2.0 but the full set of tests requires 3.5 or greater to execute.
+    The build script selects either .NET 3.5 or .NET 4.0 to perform the build,
+    depending on what is available. A Visual Studio 2008 solution is also provided.
+<li>NAnt 0.91 release is now used for building.
+<li>The Windows installer is now built using WiX 3.5, upgraded from 2.0.
+<li>The TestRunner interface has been modified. Applications using this
+    interface will need to be modified but general users are not effected.
+</ul>
+
+<h4>Framework</h4>
+
+<ul>
+<li>NUnit now supports composable <b>Action Attributes</b>, which allow the 
+    test developer to put reusable test actions into attributes and attach 
+    these actions to suites, tests, and test cases. The actions can run 
+    arbitrary code before and after suites, tests, and test cases execute. 
+    It enables the test developer to build smaller reusable actions and to 
+    compose them in unique ways for each suite, test, or test case.
+<li>The following <b>Attributes</b> have changes in NUnit 2.6:
+  <ul>
+    <li><b>TestCaseAttribute</b> now accepts <b>Explicit</b> and <b>Reason</b> 
+        named parameters.
+    <li><b>TestCaseSourceAttribute</b> now accepts a <b>Category</b> named parameter.
+    <li><b>TestCaseData</b> now supports marking individual test cases as <b>Explicit</b>.
+    <li><b>EqualConstraint</b> now recognizes and uses <b>IEquatable<T></b> if
+        it is implemented on either the actual or the expected value. The interface
+        is used in preference to any override of <b>Object.Equals()</b>, so long as
+        the other argument is of Type T. Note that this applies to all equality tests 
+        performed by NUnit.
+    <li><b>PlatformAttribute</b> accepts "Windows8", "Windows2012Server", "Net-3.0", 
+        "Net-3.5", "Mono-3.0" and "Mono-3.5" as arguments.<br>
+        <b>Note:</b> Since the 3.0 and 3.5 
+        frameworks all use the 2.0 runtime, the semantics of their use is slightly 
+        different from other key words. The "3.5" arguments also include "3.0" and "2.0" 
+        and the "3.0" arguments include "2.0" in their interpretation.
+    <li><b>TestFixtureAttribute</b> now accepts a <b>Category</b> named parameter,
+        allowing individual fixture instances to be included in or excluded from
+        a test run.
+  </ul>
+<li>The following additions have been made to the Constraint syntax:
+  <ul>
+    <li>User-defined equality comparers specified with the <b>Using</b> syntax 
+        element may now be used with collections, arrays and dictionaries. The
+        <b>Using(...)</b> syntactic element may be repeated multiple times in
+        an expression, so long as each comparer applies to a different Type.
+        NUnit will use the appropriate comparer, depending on the Type of the
+        arguments. Among other things, this allows overriding the default
+        NUnit comparison of collections, arrays and dictionaries.
+    <li><b>Is.Positive</b> may be used as a synonym for Is.GreaterThan(0).
+    <li><b>Is.Negative</b> may be used as a synonym for Is.LessThan(0).
+    <li><b>Has.Exactly(n)...</b> may be used in place of <b>Has.Some...</b>
+        in order to allow tests over collections that must be satisfied a 
+        specific number of times.
+  </ul>
+<li>When <b>Assert.Throws()</b> fails due to an exception of the wrong Type being
+    thrown, the error message now includes the Message and Stack Trace from the
+    exception.
+<li>Visual Basic users may now use <b>Assert.ByVal</b> rather than <b>Assert.That()</b>
+    to avoid errors when the first argument is a property with a non-public setter.
+<li>Documentation is provided for the previously undocumented <b>TestContext</b>. 
+    A new property <b>TestContext.WorkDirectory</b> allows tests to access the
+    name of a directory to be used for file output. This directory may be 
+    specified by use of the <b>/work</b> option of <b>nunit-console</b>.
+<li>So-called "old-style" tests, identified by having a name beginning with
+    "Test" are no longer supported in NUnit 2.6.
+<li>Setting a ThreadPriority for the test runner thread is no longer supported
+    under NUnit 2.6.
+</ul>
+
+<h4>Console</h4>
+<ul>
+<li>The following new command-line options are provided:
+  <ul>
+    <li><b>-result</b> is a synonym for <b>-xml</b>, specifying the file to be used 
+        for output of the test results in XML form. The <b>-xml</b> option is still 
+        recognized but will be removed in a future release.
+  <li><b>-noresult</b> allows supressing the xml result output entirely.
+  <li><b>-work</b> is used to specify the directory to be used for output files. Any
+        relative paths specified with the <b>-output</b>, <b>-err</b> or <b>-result</b> 
+        options are resolved using this directory as a base.
+  <li><b>-runlist</b> allows the user to specify a file that contains the names of the 
+        tests to be executed rather than listing them directly on the command line.
+    <li><b>-stoponerror</b> causes execution of the test run to terminate 
+        immediately on the first test failure or error.
+    <li><b>-apartment</b> is used to specify the ApartmentState (STA or MTA)
+        of the test runner thread. Since the default is MTA, the option is
+        only needed to force execution in the Single Threaded Apartment.
+  </ul>
+<li>The .NET 1.1 build of nunit-console no longer supports the <b>-process</b>
+    or <b>-framework</b> option. There is no automatic runtime detection and
+    tests execute under same runtime as the console runner itself. If this
+    functionality is needed when running tests under .NET 1.1, use the standard 
+    console runner to execute the tests in a separate process.
+</ul>
+
+<h4>Gui</h4>
+
+<ul>
+<li>The <b>Project Editor</b> is now a separate program, which may be executed directly 
+    or run through the Project | Edit dropdown menu of the NUnit GUI. The editor 
+    now provides two main views of the project: a property-oriented view based 
+    on the Project Editor that was built into earlier versions of the NUnit GUI 
+    and an xml view, which allows simple editing of the .nunit file.
+<li>The Gui now displays invalid tests in red immediately upon load, without waiting 
+    for the user to run them. Tests marked with the <b>IgnoreAttribute</b> are displayed
+    in yellow immediately as well.
+<li>The test reload functionality in the Gui has been rewritten and simplified so that
+    the same logic is used for all cases where the visual state of the tree is to be
+    recovered. Test results are now found even if changes to the assembly have resulted
+    in the assignment of new ids to the tests.
+<li>A number of new settings are available using the <b>Settings Dialog</b>:
+  <ul>
+  <li>The <b>Tree Display</b> page allows the user to select alternate image sets for 
+      use in the test tree. Additional user-provided image sets may be added if desired.
+  <li>The <b>Text Output</b> page allows setting the threshold for capture and display 
+      of log4net output (previously controlled by the test config file).
+  <li>The <b>Project Editor</b> page allows the user to select whether the NUnit 
+      <b>Project Editor</b> or another external program will be used when editing
+      the settings file.
+  <li>The <b>Runtime Selection</b> page allows enabling or disabling automatic
+      detection of the target runtime for each test assembly.
+  <li>The <b>Advanced Loader Settings</b> page now allows specifying the argument to use
+      in calling SetPrincipalPolicy for each test AppDomain.
+  <li>The <b>Visual Studio</b> page now includes a setting that enables or disables
+      the use of solution configs when loading Visual Studio solution files.
+  <li>The <b>Internal Trace</b> page now shows the directory path to which log files
+      will be saved.
+  </ul>
+<li>The location of the settings dialog under the Windows AppData directory has been 
+    changed from Roaming to Local. Users will need to reset their preferences in some cases.
+<li>By default, test Cases under a Theory that fail an assumption are no longer shown in the tree.
+    A context menu item has been added to allow the user to view them.
+<li>The properties dialog has been redesigned to be more compact and readable.
+<li>The context menu for the test tree has been simplified.
+<li>The directory containing the log files may be opened directly from the Gui by
+    use of a new item on the <b>Tools</b> menu.
+<li>Test summary results are truncated when the window size is too small. The full
+    summary is displayed when hovering over the field.
+</ul>
+
+<h4>PNUnit</h4>
+
+<ul>
+<li>The <b>PNUnit</b> code has been updated using the latest build from the developers
+    at Codice Software and additional examples are provided in the source.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>498659 	Registry entries and shortcuts remain after install
+<li>498690 	Assert.That() doesn't like properties with scoped setters
+<li>602761 	nunit-agent hangs after tests complete
+<li>605034 	Log4net not working with NUnit
+<li>625672 	NUnit GUI bounces to background on reload
+<li>638289 	Install uses CURRENT_USER instead of LOCAL_MACHINE for AssemblyFoldersEx
+<li>657801 	Help URL should not be in config file
+<li>676560 	Assert.AreEqual does not support IEquatable<T>
+<li>691129 	Add Category parameter to TestFixture
+<li>692180 	Script should allow building for net-2.0 under 3.5 or 4.0
+<li>697069 	Feature request: dynamic location for TestResult.xml
+<li>697329 	NUnit tries to test disabled projects
+<li>701331 	TestFixture attributes on base classes are not ignored
+<li>702734 	Separate packaging of NUnit for .NET 1.1 and 2.0
+<li>708173 	NUnit's logic for comparing arrays - use Comparer<T[]> if it is provided
+<li>709062 	"System.ArgumentException : Cannot compare" when the element is a list
+<li>711330 	Test-free assembly given failure icon in tree display
+<li>712156 	Tests cannot use AppDomain.SetPrincipalPolicy
+<li>712444 	nunit-console /run don't execute parameterized test-cases (with commas in test-case name)
+<li>719184 	Platformdependency in src/ClientUtilities/util/Services/DomainManager.cs:40
+<li>726313 	Failure in Assembly level Action attribute causes crash
+<li>728500 	TestDomain should unload the test AppDomain
+<li>735851 	Add detection of 3.0, 3.5 and 4.0 frameworks to PlatformAttribute
+<li>736062 	Deadlock when EventListener performs a Trace call + EventPump synchronisation
+<li>739039 	Add noxml option to console runner
+<li>741402 	Error running .NET 1.1 console tests
+<li>746247 	Add AllowPartiallyTrustedCallersAttribute to nunit.framework assembly
+<li>747581 	Failure in TestFixtureTearDown not reported in console runner
+<li>756843 	Failing assertion does not show non-linear tolerance mode
+<li>761579 	Tests using log4net run very slowly
+<li>766749 	net-2.0\nunit-console-x86.exe.config should have a startup element and also enable loadFromRemoteSources
+<li>770471 	Assert.IsEmpty does not support IEnumerable
+<li>785460 	Add Category parameter to TestCaseSourceAttribute
+<li>787106 	EqualConstraint provides inadequate failure information for IEnumerables
+<li>794115 	HashSet incorrectly reported
+<li>800089 	Assert.Throws() hides details of inner AssertionException
+<li>806198 	nunit console crashes when opening certain projects with common output path
+<li>816863 	System.NullReferenceException 2.6.0.11089
+<li>828739 	Run NUnit tests listed in a file
+<li>836080 	Log Directory shown incorrectly in settings dialog
+<li>836360 	When size of the Gui window is reduced, test result info may not fit in the field provided
+<li>841894 	UI won't run tests marked Explicit from the context menu
+<li>848713 	Feature request: Add switch for console to break on any test case error
+<li>878376 	Add 'Exactly(n)' to the NUnit constraint syntax
+<li>878899 	Changing logging level has no effect until NUnit is restarted
+<li>878955 	ParameterizedTest not in their parent test-suite when FixtureSetup fails in .xml result file
+<li>881617 	Tests with invalid category attributes should be more visible
+<li>881715 	Frequent socketexception in nUnit GUI
+<li>881958 	nunit-console-x86 crashes with socketexception
+<li>882137 	When no tests are run, higher level suites display as Inconclusive
+<li>882192 	Ignored test icon should be more prominent
+<li>882517 	NUnit 2.5.10 doesn't recognize TestFixture if there are only TestCaseSource inside
+<li>883271 	Reload Tests sometimes "loses" tests
+<li>885173 	Tests are still executed after cancellation by user
+<li>885277 	Exception when project calls for a runtime using only 2 digits
+<li>885604 	Feature request: Explicit named parameter to TestCaseAttribute
+<li>887005 	NUnit.exe ignores categories when using /run option
+<li>890129 	DelayedConstraint doesn't appear to poll properties of objects
+<li>890384 	When font is enlarged, layout of settings pages is incorrect
+<li>891237 	When font is enlarged, gui Test Result disappears and suite name is truncated
+<li>891265 	Add /cleanup to nunit-console.exe
+<li>891326 	Non-runnable and statically ignored tests should disable the Run item on the context menu
+<li>892844 	Not using Mono 4.0 profile under Windows
+<li>892845 	"Mono" is not clearly shown in About box or Test Assemblies dialog
+<li>892847 	Gui offers to load assemblies under a lower CLR version
+<li>893919 	DelayedConstraint fails polling properties on references which are initially null
+<li>893991 	When working directory contains # sign, it is truncated
+<li>896615 	Tests can't be run in existing AppDomain
+<li>897289 	Is.Empty constraint has unclear failure message
+<li>898192 	Feature Request: Is.Negative, Is.Positive
+<li>898256 	IEnumerable<T> for Datapoints doesn't work
+<li>898850 	NUnit 2.6 beta 2 crashes on assemblies without tests
+<li>899178 	Wrong failure message for parameterized tests that expect exceptions
+<li>902305 	Gui should not normally display Inconclusive test cases for a Theory
+<li>902343 	Gui 'Hide Tests' function no longer works
+<li>903078 	DomainUsage.None setting crashes nunit-gui
+<li>903080 	Test tree context menu needs to be simplified
+<li>904841 	After exiting for timeout the teardown method is not executed
+<li>907270 	Gui enables run when the assembly specified on the command line is not found
+<li>908829 	TestCase attribute does not play well with variadic test functions
+<li>910189 	Eliminate NUnit Configuration Section in config file
+<li>910218 	NUnit should add a trailing separator to the ApplicationBase
+<li>912955 	Project files missing in source code package
+<li>919876 	NUnit.Util.Transform.resources missing from nunit.util.dll
+<li>920472 	CollectionAssert.IsNotEmpty must dispose Enumerator
+<li>922455 	Add Support for Windows 8 and Windows 2012 Server to PlatformAttribute
+<li>924504 	NUnit project files should have an Edit command association with the project editor
+<li>928018 	Issue with test time print out
+<li>930774 	Adding or Removing a category in the Gui causes an exception
+<li>933800 	NUnit will crash when started and dll from previous project doesn't compile
+</ul>
+
+
+<h3>Earlier Releases</h3>
+
+<ul>
+<li>Release Notes for <a href="http://www.nunit.org/?p=releaseNotes&r=2.5.10">NUnit 2.5 through 2.5.10</a>
+<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.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
+<ul>
+<li><a href="releaseBreakdown.html">Release Breakdown</a></li>
+</ul>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/repeat.html b/doc/repeat.html
index 13f7f0b..731b406 100644
--- a/doc/repeat.html
+++ b/doc/repeat.html
@@ -5,6 +5,7 @@
 <title>NUnit - Repeat</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -26,22 +27,33 @@
 
 <h3>RepeatAttribute (NUnit 2.5)</h3>
 
-<p><b>RepeatAttribute</b> is used on a test case to specify that it should be 
+<p><b>RepeatAttribute</b> is used on a test method to specify that it should be
    executed multiple times. If any repetition fails, the remaining ones are
    not run and a failure is reported.
+
+<p><b>Notes:</b>
+<ol>
+<li>It is not currently possible to use RepeatAttribute on a TestFixture
+    or any other type of test suite. Only single tests may be repeated.
+<li>Since a parameterized test method represents a suite, RepeatAttribute
+    is ignored when it appears on such a method.
+</ol>
    
+
 </div>
 
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -79,12 +91,21 @@
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -92,7 +113,7 @@
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/requiredAddin.html b/doc/requiredAddin.html
index e86fdd8..0b4d9a5 100644
--- a/doc/requiredAddin.html
+++ b/doc/requiredAddin.html
@@ -5,6 +5,7 @@
 <title>NUnit - RequiredAddin</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -84,13 +85,15 @@ namespace NUnit.Tests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -128,12 +131,21 @@ namespace NUnit.Tests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -141,7 +153,7 @@ namespace NUnit.Tests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/requiresMTA.html b/doc/requiresMTA.html
index 06f9969..fa4d7e7 100644
--- a/doc/requiresMTA.html
+++ b/doc/requiresMTA.html
@@ -5,6 +5,7 @@
 <title>NUnit - RequiresMTA</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -83,13 +84,15 @@ public class AnotherFixture
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -127,12 +130,21 @@ public class AnotherFixture
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -140,7 +152,7 @@ public class AnotherFixture
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/requiresSTA.html b/doc/requiresSTA.html
index a371ba8..36ba9e1 100644
--- a/doc/requiresSTA.html
+++ b/doc/requiresSTA.html
@@ -5,6 +5,7 @@
 <title>NUnit - RequiresSTA</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -84,13 +85,15 @@ public class AnotherFixture
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -128,12 +131,21 @@ public class AnotherFixture
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -141,7 +153,7 @@ public class AnotherFixture
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/requiresThread.html b/doc/requiresThread.html
index 3c63e1f..4704049 100644
--- a/doc/requiresThread.html
+++ b/doc/requiresThread.html
@@ -5,6 +5,7 @@
 <title>NUnit - RequiresThread</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -84,13 +85,15 @@ public class AnotherFixture
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -128,12 +131,21 @@ public class AnotherFixture
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -141,7 +153,7 @@ public class AnotherFixture
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/reusableConstraint.html b/doc/reusableConstraint.html
index 1beda2b..62a3610 100644
--- a/doc/reusableConstraint.html
+++ b/doc/reusableConstraint.html
@@ -5,6 +5,7 @@
 <title>NUnit - ReusableConstraint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -118,10 +119,13 @@ the internal implementation and could disappear in future releases.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -139,13 +143,20 @@ the internal implementation and could disappear in future releases.
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -153,7 +164,7 @@ the internal implementation and could disappear in future releases.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/runningTests.html b/doc/runningTests.html
index 7a1906d..49e8004 100644
--- a/doc/runningTests.html
+++ b/doc/runningTests.html
@@ -5,6 +5,7 @@
 <title>NUnit - RunningTests</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -70,18 +71,17 @@ run your tests.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -93,6 +93,12 @@ run your tests.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -100,7 +106,7 @@ run your tests.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/runtimeSelection.html b/doc/runtimeSelection.html
index 16b28ab..fb09414 100644
--- a/doc/runtimeSelection.html
+++ b/doc/runtimeSelection.html
@@ -5,6 +5,7 @@
 <title>NUnit - RuntimeSelection</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -84,18 +85,17 @@ runtime under the Console runner.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -107,6 +107,12 @@ runtime under the Console runner.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -114,7 +120,7 @@ runtime under the Console runner.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/sameasConstraint.html b/doc/sameasConstraint.html
index 2168200..4d5e0b9 100644
--- a/doc/sameasConstraint.html
+++ b/doc/sameasConstraint.html
@@ -5,6 +5,7 @@
 <title>NUnit - SameasConstraint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -57,10 +58,13 @@ Assert.That( ex3, Is.Not.SameAs( ex1 ) );
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -78,13 +82,20 @@ Assert.That( ex3, Is.Not.SameAs( ex1 ) );
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -92,7 +103,7 @@ Assert.That( ex3, Is.Not.SameAs( ex1 ) );
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/samples.html b/doc/samples.html
index d830fef..fd7b9d4 100644
--- a/doc/samples.html
+++ b/doc/samples.html
@@ -5,6 +5,7 @@
 <title>NUnit - Samples</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -29,9 +30,9 @@ dt { font-weight: bold; }
 --></style>
 <h2>Samples</h2>
 
-NUnit 2.5 samples continue to be organized by language, with an additional 
+The samples installed with NUnit continue to be organized by language, with an additional 
 folder for Extensibility examples. The 'money-port' example has been
-removed.
+removed as of NUnit 2.5.
 
 <h3>C# Samples</h3>
 <dl>
@@ -97,18 +98,22 @@ removed.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -116,7 +121,7 @@ removed.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/sequential.html b/doc/sequential.html
index bf7e235..b18b5cd 100644
--- a/doc/sequential.html
+++ b/doc/sequential.html
@@ -5,6 +5,7 @@
 <title>NUnit - Sequential</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -63,13 +64,15 @@ public void MyTest(
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -107,12 +110,21 @@ public void MyTest(
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -120,7 +132,7 @@ public void MyTest(
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/setCulture.html b/doc/setCulture.html
index 0edc731..26b637d 100644
--- a/doc/setCulture.html
+++ b/doc/setCulture.html
@@ -5,6 +5,7 @@
 <title>NUnit - SetCulture</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -127,13 +128,15 @@ public class FrenchCultureTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -171,12 +174,21 @@ public class FrenchCultureTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -184,7 +196,7 @@ public class FrenchCultureTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/setUICulture.html b/doc/setUICulture.html
index 1ab9b1c..564c7a1 100644
--- a/doc/setUICulture.html
+++ b/doc/setUICulture.html
@@ -5,6 +5,7 @@
 <title>NUnit - SetUICulture</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -127,13 +128,15 @@ public class FrenchCultureTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -171,12 +174,21 @@ public class FrenchCultureTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -184,7 +196,7 @@ public class FrenchCultureTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/settingsDialog.html b/doc/settingsDialog.html
index 8a45268..ca92c21 100644
--- a/doc/settingsDialog.html
+++ b/doc/settingsDialog.html
@@ -5,6 +5,7 @@
 <title>NUnit - SettingsDialog</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -30,6 +31,8 @@
 control some aspects of NUnit’s operation. Beginning with NUnit 2.4.4, a tree-based dialog
 replaced the older tabbed format.</p>
 
+<!-- Gui Settings - General -->
+
 <hr><h3>Gui Settings - General</h3><hr>
 
 <div class="screenshot-right">
@@ -59,6 +62,8 @@ long as the missing file is not actually selected.
 last file opened unless it is run with a specific filename or with the 
 <code>/noload</code> parameter.</p>
 
+<!-- Gui Settings - Tree Display -->
+
 <hr style="clear: both"><h3>Gui Settings - Tree Display</h3><hr>
 
 <div class="screenshot-right">
@@ -66,7 +71,7 @@ last file opened unless it is run with a specific filename or with the
 
 <h3>Tree View</h3>
 
-<p>The list box allows selecting the degree of expansion of the tree when tests are loaded:</p>
+<p>The <b>Initial Display</b> 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>
@@ -74,6 +79,10 @@ last file opened unless it is run with a specific filename or with the
 <p><b>Hide Tests</b> – expands all suites except for the fixtures themselves.</p>
 </blockquote>
 
+<p>NUnit provides four sets of <b>Tree Images</b>, which are used to mark tests in
+the gui as passing, failing, etc. Use the list box to select the preferred set.
+A preview of the selected set is displayed.
+
 <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>
@@ -96,6 +105,8 @@ category selection.
 <p>If <b>Flat list of TestFixtures</b> is selected, tests will be
    shown as a sequential list of fixtures.
 
+<!-- Gui Settings - Test Results -->
+
 <hr style="clear: both"><h3>Gui Settings - Test Results</h3><hr>
 
 <div class="screenshot-right">
@@ -121,6 +132,8 @@ normally choose one or the other.</p>
 <b>Tests Not Run</b> tab, which shows information about tests that were
 skipped or ignored.
 
+<!-- Gui Settings - Text Output -->
+
 <hr style="clear: both"><h3>Gui Settings - Text Output</h3><hr>
 
 <div class="screenshot-right">
@@ -146,34 +159,48 @@ 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
+<p>The check boxes and combo 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.
+<p>When checked, NUnit captures all output written to Console.Out.
 
 <h4>Error Output</h4>
-<p>Captures all output written to Console.Error.
+<p>When checked, NUnit captures all output written to Console.Error.
 
 <h4>Trace Output</h4>
-<p>Captures all output written to Trace or Debug.
+<p>When checked, NUnit 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.
+<p>Use the combobox to select the output level. When set to any
+level other than <b>Off</b>, NUnit captures log4net output at or above
+that level.
+
+<h4>Test Case Labels</h4>
+
+<p>Select <b>On</b> to precede text in the output window with the name 
+of the test that produced it. Select <b>All</b> to display a label for
+every test case, even those that produce no output.</p>
+
+<!-- Gui Settings - Project Editor -->
 
-<h3>Test Labels</h3>
+<hr style="clear: both"><h3>Gui Settings - Project Editor</h3><hr>
 
-<p>Check <b>Display TestCase Labels</b> to precede text in the output window
-with the name of the test that produced it.</p>
+<div class="screenshot-right">
+   <img src="img/projectEditorSettings.jpg"></div>
+
+<p>This page determines what editor is opened when you use the <b>Edit...</b>
+item on the <b>Project</b> menu. 
 
-<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.
+<p>If you select <b>Use NUnit Project Editor</b>, the NUnit project editor is used. 
 
+<p>If you select <b>Use Program</b> and supply a valid executable path, the
+program you specify will be executed with the full path to the NUnit settings 
+file as it's single argument.
+
+<!-- Test Loader Settings - Assembly Isolation -->
 
 <hr style="clear: both"><h3>Test Loader Settings - Assembly Isolation</h3><hr>
 
@@ -213,6 +240,8 @@ a separate process is used for each test assembly.
    used, they will be merged across all assemblies. This option is only
    available when tests are run in the same appdomain.
 
+<!-- Test Loader Settings - Assembly Reload -->
+
 <hr style="clear: both"><h3>Test Loader Settings - Assembly Reload</h3><hr>
 
 <div class="screenshot-right">
@@ -228,7 +257,23 @@ 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>
-   
+ 
+<!-- Test Loader Settings - Runtime Selection -->
+
+<hr style="clear: both"><h3>Test Loader Settings - Runtime Selection</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/runtimeSelectionSettings.jpg"></div>
+
+<p>This page determines which runtime is used to load tests by default,
+   when no runtime has been specified by the user.
+
+<p>If <b>Select default runtime...</b> is checked, NUnit will examine each
+   test assembly and try to use the runtime for which it was built to load it.
+   If left unchecked, NUnit will use the current runtime to load the assembly.
+
+<!-- Test Loader Settings - Advanced -->
+
 <hr style="clear: both"><h3>Test Loader Settings - Advanced</h3><hr>
 
 <div class="screenshot-right">
@@ -245,6 +290,18 @@ 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.
 
+<h3>Principal Policy</h3>
+
+<p>Because NUnit access current thread's <b>Principal</b> before running tests,
+it is not possible to effectively call <b>SetPrincipalPolicy()</b> in a test or
+in the system being tested.
+
+<p>To remedy this problem, NUnit can call<b>SetPrincipalPolicy()</b> on your
+   behalf. If <b>Set Principal Policy...</b> is checked, NUnit will call it 
+   using the <b>PrincipalPolicy</b> type selected in the list when it sets up 
+   each test <b>AppDomain</b>
+
+<!-- IDE Support Settings - Visual Studio -->
 
 <hr style="clear: both"><h3>IDE Support Settings - Visual Studio</h3><hr>
 
@@ -256,6 +313,15 @@ Assembly.Location.
 <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>
 
+<p>If <b>Use solution configs...</b> is checked, NUnit will make use of solution
+   configs when loading Visual Studio solutions. If it is unchecked, solution
+   configs are ignored and all project configs are included.
+
+<p>This setting is checked by default. Uncheck it if you want NUnit to load
+   solution files compatibly with version 2.5.
+
+<!-- Advanced Settings - Internal Trace -->
+
 <hr style="clear: both"><h3>Advanced Settings - Internal Trace</h3><hr>
 
 <div class="screenshot-right">
@@ -265,6 +331,9 @@ and solutions and add Visual Studio projects to existing test projects.</p>
 
 <p>The <b>Trace Level</b> dropdown controls the level of internal trace output.</p>
 
+<p><b>Log Directory</b> displays the path of the directory to which all internal
+   trace log files are saved.
+
 
 
 
@@ -273,12 +342,10 @@ and solutions and add Visual Studio projects to existing test projects.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -291,10 +358,10 @@ and solutions and add Visual Studio projects to existing test projects.</p>
 <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="projectEditor.html">Project Editor</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>
@@ -306,6 +373,12 @@ and solutions and add Visual Studio projects to existing test projects.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -313,7 +386,7 @@ and solutions and add Visual Studio projects to existing test projects.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/setup.html b/doc/setup.html
index a345283..b324455 100644
--- a/doc/setup.html
+++ b/doc/setup.html
@@ -5,6 +5,7 @@
 <title>NUnit - Setup</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -175,13 +176,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -219,12 +222,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -232,7 +244,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/setupFixture.html b/doc/setupFixture.html
index d16fca1..24cac24 100644
--- a/doc/setupFixture.html
+++ b/doc/setupFixture.html
@@ -5,6 +5,7 @@
 <title>NUnit - SetupFixture</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -152,13 +153,15 @@ public class MySetUpClass
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -196,12 +199,21 @@ public class MySetUpClass
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -209,7 +221,7 @@ public class MySetUpClass
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/stringAssert.html b/doc/stringAssert.html
index a04b0b3..383450c 100644
--- a/doc/stringAssert.html
+++ b/doc/stringAssert.html
@@ -5,6 +5,7 @@
 <title>NUnit - StringAssert</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -65,9 +66,11 @@ StringAssert.IsMatch( string regexPattern, string actual,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -82,14 +85,22 @@ StringAssert.IsMatch( string regexPattern, string actual,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -97,7 +108,7 @@ StringAssert.IsMatch( string regexPattern, string actual,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/stringConstraints.html b/doc/stringConstraints.html
index 02107dc..666be89 100644
--- a/doc/stringConstraints.html
+++ b/doc/stringConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - StringConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -200,10 +201,13 @@ Expect( phrase, Matches( "Make.*pass" ) );
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -221,13 +225,20 @@ Expect( phrase, Matches( "Make.*pass" ) );
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -235,7 +246,7 @@ Expect( phrase, Matches( "Make.*pass" ) );
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/suite.html b/doc/suite.html
index 76c811d..b2eb80e 100644
--- a/doc/suite.html
+++ b/doc/suite.html
@@ -5,6 +5,7 @@
 <title>NUnit - Suite</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -174,13 +175,15 @@ of the planning for future NUnit releases.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -218,12 +221,21 @@ of the planning for future NUnit releases.
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -231,7 +243,7 @@ of the planning for future NUnit releases.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/suiteBuilders.html b/doc/suiteBuilders.html
index c256064..3796fab 100644
--- a/doc/suiteBuilders.html
+++ b/doc/suiteBuilders.html
@@ -5,6 +5,7 @@
 <title>NUnit - SuiteBuilders</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -61,12 +62,10 @@ build a fixture using the provided Type.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -86,6 +85,12 @@ build a fixture using the provided Type.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -93,7 +98,7 @@ build a fixture using the provided Type.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/teardown.html b/doc/teardown.html
index 0af7daa..6c04b53 100644
--- a/doc/teardown.html
+++ b/doc/teardown.html
@@ -5,6 +5,7 @@
 <title>NUnit - Teardown</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -175,13 +176,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -219,12 +222,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -232,7 +244,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/test.html b/doc/test.html
index 904c287..8e26276 100644
--- a/doc/test.html
+++ b/doc/test.html
@@ -5,6 +5,7 @@
 <title>NUnit - Test</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -148,13 +149,15 @@ public class SuccessTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -195,12 +198,21 @@ public class SuccessTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -208,7 +220,7 @@ public class SuccessTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testCase.html b/doc/testCase.html
index da711c9..a2811e6 100644
--- a/doc/testCase.html
+++ b/doc/testCase.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestCase</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -83,26 +84,28 @@ named parameters, which may be used as follows:
 <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>Explicit</b>
+<dd>Set to true in order to make the individual test case Explicit. Use <b>Reason</b> to explain why.
+<dt><b>Ignore</b>
+<dd>Set to true in order to ignore the individual test case. Use <b>Reason</b> to explain why.
+<dt><b>IgnoreReason</b>
+<dd>Causes this test case to be ignored and specifies the reason. Equivalent to <b>Ignore</b> combined with <b>Reason</b>. This attribute will be removed in a later release.
 <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>)
+<dd>A <b>MessageMatch</b> enum value indicating how to test the expected message (See <a href="exception.html">ExpectedExceptionAttribute</a>)
+<dt><b>Reason</b>
+<dd>Specifies the reason for not running this test case. Use in conjunction with <b>Ignore</b> or <b>Explicit</b>.
 <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
+   that order. Beginning 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.
@@ -116,13 +119,15 @@ the method name and the arguments provided.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -160,12 +165,21 @@ the method name and the arguments provided.
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -173,7 +187,7 @@ the method name and the arguments provided.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testCaseSource.html b/doc/testCaseSource.html
index 0279617..11d7532 100644
--- a/doc/testCaseSource.html
+++ b/doc/testCaseSource.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestCaseSource</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -58,6 +59,13 @@ to provide test cases. It has the following characteristics:
 	The rules for this are described in the next section.
 </ul>
 
+<p><b>TestCaseSourceAttribute</b> supports one named parameter:
+
+<dl>
+<dt><b>Category</b>
+<dd>Used to assign one or more categories to every test case returned from this source.
+</dl>
+
 <h3>Constructing Test Cases</h3>
 
 <p>In constructing tests, NUnit uses each item returned by
@@ -81,6 +89,11 @@ did not implement <b>ITestCaseData</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>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.
   <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.
@@ -91,11 +104,6 @@ did not implement <b>ITestCaseData</b>.
   <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>
@@ -200,27 +208,31 @@ and methods, which may be appended to an instance in any order.
 
 <p>
 <dl>
+  <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.
+  <dt><b>.MakeExplicit()</b>
+  <dd>Causes the test case to be marked explicit.
+  <dt><b>.MakeExplicit(string)</b>
+  <dd>Causes the test case to be marked explicit and specifies the reason for doing so.
   <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>.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>.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>
@@ -261,13 +273,15 @@ themselves.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -305,12 +319,21 @@ themselves.
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -318,7 +341,7 @@ themselves.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testContext.html b/doc/testContext.html
new file mode 100644
index 0000000..c6c3e65
--- /dev/null
+++ b/doc/testContext.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 - TestContext</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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>TestContext (NUnit 2.5.7 / 2.6)</h2>
+
+<p>Each NUnit test runs in an execution context, which includes information about the environment as well as the test itself.
+The <b>TestContext</b> class allows tests to access certain information about the execution context.
+
+<p>This class has been present in NUnit since 2.5.7, but was undocumented until the 2.6 release. Those earlier versions of TestContext are not covered here.
+
+<h3>CurrentContext</h3>
+
+<p>The context of the currently executing test may be accessed by
+use of the static property <b>CurrentContext</b>, which gets
+a reference to the current <b>TestContext</b>. This context
+is created separately for each test before it begins execution.
+
+<p>All other properties apply to the <b>TestContext</b> instance returned by <b>CurrentContext</b>. Note that the context may not be changed - all properties are read-only.
+
+<h3>Test</h3>
+
+<p>Gets a representation of the current test, with the following properties:
+
+<ul>
+<li><b>Name</b> - The name of the test
+<li><b>FullName</b> - The fully qualified name of the test
+<li><b>Properties</b> - An <b>IDictionary</b> of the test properties
+</ul>
+
+<h3>Result</h3>
+
+<p>Gets a representation of the test result, with the following properties:
+
+<ul>
+<li><b>Status</b> - A <b>TestStatus</b> with possible values
+  <ul>
+  <li>Inconclusive
+  <li>Skipped
+  <li>Passed
+  <li>Failed
+  </ul>
+<li><b>State</b> - A <b>TestState</b> with possible values
+  <ul>
+  <li>Inconclusive
+  <li>NotRunnable
+  <li>Skipped
+  <li>Ignored
+  <li>Success
+  <li>Failure
+  <li>Error
+  <li>Cancelled
+  </ul>
+</ul>
+
+<h4>Notes:</h4>
+<ol>
+<li>The result of the test may be accessed during setup or test execution, but it only has a useful value at in the TearDown method.
+<li>The <b>Status</b> value should be used in preference to <b>State</b> wherever possible, since the latter will not be available in future releases.
+</ol>
+
+<h3>TestDirectory</h3>
+
+<p>Gets the full path of the directory containing the current test assembly.
+
+<h3>WorkDirectory</h3>
+
+<p>Gets the full path of the directory to be used for output from this test run. The XML result file and any redirected output files are located under this directory. This is normally the directory that was current when execution of
+NUnit began but may be changed by use of the <b>/work</b> option of nunit-console.
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li id="current"><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/testDecorators.html b/doc/testDecorators.html
index d23349c..d124c72 100644
--- a/doc/testDecorators.html
+++ b/doc/testDecorators.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestDecorators</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -72,12 +73,10 @@ standard values are defined for use if desired:
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -97,6 +96,12 @@ standard values are defined for use if desired:
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -104,7 +109,7 @@ standard values are defined for use if desired:
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testFixture.html b/doc/testFixture.html
index 7ffefbb..c52d0d9 100644
--- a/doc/testFixture.html
+++ b/doc/testFixture.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestFixture</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -365,13 +366,15 @@ public class DeduceTypeArgsFromArgs<T1, T2>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -409,12 +412,21 @@ public class DeduceTypeArgsFromArgs<T1, T2>
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -422,7 +434,7 @@ public class DeduceTypeArgsFromArgs<T1, T2>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testProperties.html b/doc/testProperties.html
index 2a06328..ef1b8bb 100644
--- a/doc/testProperties.html
+++ b/doc/testProperties.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestProperties</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -39,12 +40,10 @@ 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.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <ul>
 <li><a href="nunit-console.html">Console Runner</a></li>
@@ -57,10 +56,10 @@ which causes it to remain open as the user clicks on different tests.</p>
 <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="projectEditor.html">Project Editor</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>
@@ -72,6 +71,12 @@ which causes it to remain open as the user clicks on different tests.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -79,7 +84,7 @@ which causes it to remain open as the user clicks on different tests.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testcaseBuilders.html b/doc/testcaseBuilders.html
index 45efbc5..34986d2 100644
--- a/doc/testcaseBuilders.html
+++ b/doc/testcaseBuilders.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestcaseBuilders</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -72,12 +73,10 @@ provided as an argument or null if the method cannot be used.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -97,6 +96,12 @@ provided as an argument or null if the method cannot be used.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -104,7 +109,7 @@ provided as an argument or null if the method cannot be used.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/testcaseProviders.html b/doc/testcaseProviders.html
index 2d8bf64..aed3f96 100644
--- a/doc/testcaseProviders.html
+++ b/doc/testcaseProviders.html
@@ -5,6 +5,7 @@
 <title>NUnit - TestcaseProviders</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -100,12 +101,10 @@ to avoid the overhead of reflecting on the properties.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</a></li>
 <li><a href="runningTests.html">Running Tests</a></li>
 <li><a href="extensibility.html">Extensibility</a></li>
 <ul>
@@ -125,6 +124,12 @@ to avoid the overhead of reflecting on the properties.
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -132,7 +137,7 @@ to avoid the overhead of reflecting on the properties.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/theory.html b/doc/theory.html
index 3d73e49..3844842 100644
--- a/doc/theory.html
+++ b/doc/theory.html
@@ -5,6 +5,7 @@
 <title>NUnit - Theory</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -24,7 +25,7 @@
 
 <div id="content">
 
-<h3>TheoryAttribute (NUnit 2.5) (Experimental)</h3>
+<h3>TheoryAttribute (NUnit 2.5)</h3>
 
 <p>A Theory is a special type of test, used to verify a general
    statement about the system under development. Normal tests are
@@ -61,6 +62,11 @@
    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.
+
+<p>For <b>boolean</b> and <b>enum</b> arguments, NUnit can supply the 
+   data without any action by the user. All possible values are supplied
+   to the argument. This feature is disabled if the user supplies any 
+   values for the argument.
    
 <h4>Assumptions</h4>
 
@@ -84,6 +90,11 @@
        there are <b>no</b> assertion failures or exceptions, then the
 	   Theory passes.
    </ul>
+
+<p>Since the user does not generally care about inconclusive cases under
+   a theory, they are not normally displayed in the Gui. For situations
+   where they are needed - such as debugging - the context menu for the
+   theory provides an option to display them.
    
 <h4>Example:</h4>
 
@@ -127,13 +138,15 @@ public class SqrtTests
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -171,12 +184,21 @@ public class SqrtTests
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -184,7 +206,7 @@ public class SqrtTests
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/throwsConstraint.html b/doc/throwsConstraint.html
index 2752478..905e80b 100644
--- a/doc/throwsConstraint.html
+++ b/doc/throwsConstraint.html
@@ -5,6 +5,7 @@
 <title>NUnit - ThrowsConstraint</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -114,10 +115,13 @@ Assert.That( SomeMethod,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -135,13 +139,20 @@ Assert.That( SomeMethod,
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -149,7 +160,7 @@ Assert.That( SomeMethod,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/timeout.html b/doc/timeout.html
index 5d2cbca..bf66147 100644
--- a/doc/timeout.html
+++ b/doc/timeout.html
@@ -5,6 +5,7 @@
 <title>NUnit - Timeout</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -59,13 +60,15 @@ public void PotentiallyLongRunningTest()
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -103,12 +106,21 @@ public void PotentiallyLongRunningTest()
 <li><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -116,7 +128,7 @@ public void PotentiallyLongRunningTest()
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/typeAsserts.html b/doc/typeAsserts.html
index 9c1172b..4e5e376 100644
--- a/doc/typeAsserts.html
+++ b/doc/typeAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - TypeAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -89,9 +90,11 @@ Assert.IsNotAssignableFrom<T>( object actual,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -106,14 +109,22 @@ Assert.IsNotAssignableFrom<T>( object actual,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -121,7 +132,7 @@ Assert.IsNotAssignableFrom<T>( object actual,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/typeConstraints.html b/doc/typeConstraints.html
index c71a8ec..dbf3c89 100644
--- a/doc/typeConstraints.html
+++ b/doc/typeConstraints.html
@@ -5,6 +5,7 @@
 <title>NUnit - TypeConstraints</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -59,10 +60,13 @@ Expect( "Hello", AssignableFrom(typeOf(string)));
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
 <li><a href="constraintModel.html">Constraints</a></li>
 <ul>
 <li><a href="equalConstraint.html">Equal Constraint</a></li>
@@ -80,13 +84,20 @@ Expect( "Hello", AssignableFrom(typeOf(string)));
 <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="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -94,7 +105,7 @@ Expect( "Hello", AssignableFrom(typeOf(string)));
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/upgrade.html b/doc/upgrade.html
index cf59550..ef61a1c 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -5,6 +5,7 @@
 <title>NUnit - Upgrade</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -26,37 +27,28 @@
 
 <h2>From NUnit 2.x</h2>
 
-<p>Beginning with version 2.2.1, old style test cases ("Test....") are no longer 
-recognized by default. We recommend that you convert such test cases to use the
-<a href="test.html">TestAttribute</a>. Alternatively, you may
-specify a setting in the test config file to allow use of old style test cases by
-default.</p>
+<p>In general, there are two approaches to running tests built against earlier
+   versions of the NUnit framework from 2.0 through 2.5.10:
 
-<p>Beginning with NUnit 2.2.2, NUnit is able to run tests Built with older
-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.
+<ol>
+<li>Run the tests without recompilation. This is the best approach when no
+    further changes are to be made to a project. Ensure that the framework
+    assembly against which the tests were built continues to be avaialble
+    in the test directory.
+<li>Recompile the tests referencing the latest version of the framework assembly.
+    This is usually the best option when a project is still under development.
+</ol>
 
-<h2>From NUnit 1.x</h2>
+<p style="margin-left: 3em"><b>Note:</b>
+   NUnit 2.6 no longer recognizes "old style" test cases - those
+   identified by a name beginning with "Test". If you have such tests, you will
+   need to convert them to use the <a href="test.html">TestAttribute</a>   and recompile your tests. In such cases, it makes sense to recompile against
+   the latest framework.
 
-<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.
+<h2>From NUnit 1.x</h2>
 
-<h3>Suite property</h3>
-<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>
+<p>Tests originally compiled against a version of NUnit prior to 2.0 will need
+   to be rewritten and recompiled in order to run under NUnit 2.6.
 
 
 </div>
@@ -64,7 +56,7 @@ in order for your tests to load correctly.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
 <ul>
@@ -74,15 +66,19 @@ in order for your tests to load correctly.
 <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="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -90,7 +86,7 @@ in order for your tests to load correctly.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/utilityAsserts.html b/doc/utilityAsserts.html
index 14d492c..39d3a0a 100644
--- a/doc/utilityAsserts.html
+++ b/doc/utilityAsserts.html
@@ -5,6 +5,7 @@
 <title>NUnit - UtilityAsserts</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -85,9 +86,11 @@ public void AssertStringContains( string expected, string actual,
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</a></li>
+<ul>
 <li><a href="assertions.html">Assertions</a></li>
 <ul>
 <li><a href="equalityAsserts.html">Equality Asserts</a></li>
@@ -102,14 +105,22 @@ public void AssertStringContains( string expected, string actual,
 <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="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -117,7 +128,7 @@ public void AssertStringContains( string expected, string actual,
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/valueSource.html b/doc/valueSource.html
index d050ecf..59754b0 100644
--- a/doc/valueSource.html
+++ b/doc/valueSource.html
@@ -5,6 +5,7 @@
 <title>NUnit - ValueSource</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -93,13 +94,15 @@ themselves.
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -137,12 +140,21 @@ themselves.
 <li><a href="values.html">Values</a></li>
 <li id="current"><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -150,7 +162,7 @@ themselves.
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/values.html b/doc/values.html
index 1c060e8..10cdf09 100644
--- a/doc/values.html
+++ b/doc/values.html
@@ -5,6 +5,7 @@
 <title>NUnit - Values</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -67,13 +68,15 @@ public void MyTest(
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</a></li>
 <ul>
 <li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
 <ul>
+<li><a href="actionAttributes.html">Action Attributes</a></li>
 <li><a href="category.html">Category</a></li>
 <li><a href="combinatorial.html">Combinatorial</a></li>
 <li><a href="culture.html">Culture</a></li>
@@ -111,12 +114,21 @@ public void MyTest(
 <li id="current"><a href="values.html">Values</a></li>
 <li><a href="valueSource.html">ValueSource</a></li>
 </ul>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -124,7 +136,7 @@ public void MyTest(
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/vsSupport.html b/doc/vsSupport.html
index 06b34c9..dbde671 100644
--- a/doc/vsSupport.html
+++ b/doc/vsSupport.html
@@ -5,6 +5,7 @@
 <title>NUnit - VsSupport</title>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 <meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
 <link rel="stylesheet" type="text/css" href="nunit.css">
 <link rel="shortcut icon" href="favicon.ico">
 </head>
@@ -26,10 +27,9 @@
 
 <h2>Visual Studio Support</h2>
 
-<p>Visual Studio support in this release is a sort of “poor man’s integration.” We have implemented
-a number of features while avoiding any that would require using an Addin or otherwise
-interacting with the Visual Studio extensibility model.</p>
-
+<p>NUnit supports the Visual Studio project and solution format, which are also 
+   used by a number of other IDEs. Visual Studio support is enabled/disabled
+   by use of the <a href="settingsDialog.html">Settings Dialog</a>
 <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 
@@ -73,7 +73,7 @@ node with the assembly shown as its descendant.</p>
 
 <p>When tests are run for a Visual studio project, they run just as if the output assembly had been
 loaded with one exception. The default location for the config file is the directory containing the
-project file and it’s default name is the same as the project file with an extension of .config.
+project file and it's default name is the same as the project file with an extension of .config.
 For example, the following command would load the tests in the nunit.tests assembly using the
 configuration file nunit.tests.dll.config located in the same directory as the dll.
 	<pre class="programtext">        nunit.exe nunit.tests.dll</pre>
@@ -92,7 +92,7 @@ possible to load and run tests using this method directly.</p>
 <p>Beginning with NUnit 2.2.2, you may also open a Visual Studio solution by dragging it to the gui tree control.</p>
 
 <p>When a solution contains projects located elsewhere in the file system, it may not be possible to
-run the tests – although the solution will generally load without problem. In this case, the Project
+run the tests - although the solution will generally load without problem. In this case, the Project
 Editor should be use to modify and save the NUnit test project so that there is all referenced
 assemblies are located in or beneath the application base directory.</p>
 
@@ -107,18 +107,17 @@ specified in the VS project.</p>
 <!-- Submenu -->
 <div id="subnav">
 <ul>
-<li><a href="index.html">NUnit 2.5.10</a></li>
+<li><a href="index.html">NUnit 2.6</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="writingTests.html">Writing Tests</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="projectEditor.html">Project Editor</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>
@@ -130,6 +129,12 @@ specified in the VS project.</p>
 <li><a href="samples.html">Samples</a></li>
 <li><a href="license.html">License</a></li>
 </ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
 </ul>
 </div>
 <!-- End of Submenu -->
@@ -137,7 +142,7 @@ specified in the VS project.</p>
 
 <!-- Standard Footer for NUnit.org -->
 <div id="footer">
-  Copyright © 2010 Charlie Poole. All Rights Reserved.
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
 </div>
 <!-- End of Footer -->
 
diff --git a/doc/vsTestAdapter.html b/doc/vsTestAdapter.html
new file mode 100644
index 0000000..ed82533
--- /dev/null
+++ b/doc/vsTestAdapter.html
@@ -0,0 +1,123 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - VsTestAdapter</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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 Test Adapter for Visual Studio 11</h2>
+
+<p>The NUnit Test Adapter allows you to run NUnit tests inside
+   Visual Studio. The current release, version 0.90, only works 
+   with the Visual Studio 11 Developer Preview, which is available 
+   for download from Microsoft. Earlier releases of Visual Studio
+   did not have the ability to recognize tests built with Open
+   Source testing frameworks like NUnit.
+
+<h3>Installation</h3>
+
+<p>The easiest way to install the NUnit Test Adapter is using the
+   Extension Manager within Visual Studio. Follow these steps:
+   <ol>
+   <li>From within Visual Studio 11, select Tools | Extension Manager.
+   <li>In the left panel of the Extension Manager, select Online Extensions.
+   <li>Locate the NUnit Test Adapter in the center panel and highlight it.
+   <li>Click 'Download' and follow the instructions.
+   </ol>
+
+<p>Use the Extension Manager to ensure that the NUnit Test Adapter is enabled.
+
+<h3>Usage</h3>
+
+<p>In preparation for using the test adapter, make sure that the Unit
+   Test Explorer is shown in your window. If you don't see it, use
+   View | Other Windows | Unit Test Explorer to show it and position
+   the window where you would like it within Visual Studio.
+
+<div class="screenshot-left">
+   <img src="img/nunitTestAdapter.png"></div>
+
+<p>When you initially open a solution, no tests will be displayed.
+   After compiling the assemblies in the solution, Visual Studio will
+   interact with the NUnit Test Adapter to discover tests and a list 
+   of them will be shown in the Unit Test Explorer.
+
+<p>Click on <b>Run All Tests</b> in the Unit Test Explorer to run 
+   all the tests. You may also select one or more tests in the list and 
+   run them by right-clicking and using the context menu.
+
+<p>The context menu also contains entries for debugging tests and for
+   navigating to the source code of a test.
+
+<h3>Known Problems</h3>
+
+<ol>
+<li>There is no test status corresponding to NUnit's <b>Inconclusive</b>
+    result, so tests with this result are reported as <b>Not Run</b>.
+<li>Test cases appear in a flat list, without any grouping by fixture or
+    namespace. This can make it hard to select a group of related tests 
+    to be run. It is, however, relatively easy to rerun all failing tests.
+<li>Theories are reported as individual cases, rather as a single unit.
+<li>Startup performance is rather poor in this release.
+</ol>
+
+<h3>Reporting Problems</h3>
+
+<p>Until a separate project is created, bugs should be reported using
+   the <a href="http://bugs.launchpad.net/nunitv2">NUnit bug list</a>.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
+<li id="current"><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/vsTestAdapterLicense.html b/doc/vsTestAdapterLicense.html
new file mode 100644
index 0000000..178314d
--- /dev/null
+++ b/doc/vsTestAdapterLicense.html
@@ -0,0 +1,90 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - VsTestAdapterLicense</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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>License - NUnit Test Adapter for Visual Studio 11</h2>
+
+<p><b>Copyright © 2012 Charlie Poole</b>
+
+<p>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:
+ 
+<p>The above copyright notice and this permission notice shall be
+   included in all copies or substantial portions of the Software.
+ 
+<p>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.
+
+<h4>Notice</h4>
+
+<p>NUnit 2.6 assemblies distributed with this adapter are subject to the
+   <a href="license.html">NUnit license</a>.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li><a href="writingTests.html">Writing Tests</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li id="current"><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/doc/writingTests.html b/doc/writingTests.html
new file mode 100644
index 0000000..178a764
--- /dev/null
+++ b/doc/writingTests.html
@@ -0,0 +1,80 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - WritingTests</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<meta name="norton-safeweb-site-verification" content="tb6xj01p4hgo5x-8wscsmq633y11-e6nhk-bnb5d987bseanyp6p0uew-pec8j963qlzj32k5x9h3r2q7wh-vmy8bbhek5lnpp5w4p8hocouuq39e09jrkihdtaeknua" />
+<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>Writing Tests</h2>
+
+<p>NUnit tests may be written using any .NET language that supports attributes.
+
+<p><a href="attributes.html">Attributes</a> are used to indicate
+   test classes and methods and to modify their behavior in various ways.
+
+<p><a href="assertions.html">Assertions</a> test an actual value
+   against one or more <a href="constraintModel.html">Constraints</a>   and result in either a successful test or a failure.
+
+<p>User code may acquire information about the test and it's environment by
+   use of the <a href="testContext.html">Test Context</a>.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<li id="current"><a href="writingTests.html">Writing Tests</a></li>
+<ul>
+<li><a href="assertions.html">Assertions</a></li>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="constraintModel.html">Constraints</a></li>
+<li><a href="testContext.html">Test Context</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>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter 0.90</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+</ul>
+<li><a href="&r=2.6.html"></a></li>
+<li><a href="&r=2.6.html"></a></li>
+</ul>
+</div>
+<!-- End of Submenu -->
+
+
+<!-- Standard Footer for NUnit.org -->
+<div id="footer">
+  Copyright © 2012 Charlie Poole. All Rights Reserved.
+</div>
+<!-- End of Footer -->
+
+</body>
+</html>
diff --git a/install/NUnit.wxs b/install/NUnit.wxs
index d948492..c18f2a8 100644
--- a/install/NUnit.wxs
+++ b/install/NUnit.wxs
@@ -1,61 +1,52 @@
 <?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" />
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Product UpgradeCode="009074FF-2CEC-4b0c-9951-B07186F9ED3A" Name="NUnit $(var.NominalVersion)" Id="321FC471-2945-4d25-8D04-10B6A7AE5F15" Version="$(var.ProductVersion)" Manufacturer="nunit.org" Language="1033">
+
+    <Package Comments="NUnit $(var.ProductVersion)" Manufacturer="nunit.org" InstallerVersion="200" Platform="x86" Languages="1033" Compressed="yes" SummaryCodepage="1252" />
 
     <!-- ***************************************************************** -->
-    <!-- **********  Define Properties used in the install      ********** -->
+    <!-- **********       Define Install Conditions             ********** -->
     <!-- ***************************************************************** -->
 
-    <Property Id="FRAMEWORK10">
-      <RegistrySearch Id='Framework10Registry' Type='raw' Root='HKLM'
-                      Key='Software\Microsoft\.NETFramework\policy\v1.0' Name='3705' />
-    </Property>
+    <Condition Message="NUnit requires .NET 2.0, .NET 4.0 or Mono to be installed as a prerequisite.">
+      FRAMEWORK20 OR FRAMEWORK40 OR MONODIRECTORY
+    </Condition>
 
-    <Property Id="FRAMEWORK11">
-      <RegistrySearch Id='Framework11Registry' Type='raw' Root='HKLM'
-                      Key='Software\Microsoft\.NETFramework\policy\v1.1' Name='4322' />
-    </Property>
+    <!-- ***************************************************************** -->
+    <!-- **********  Define Properties used in the install      ********** -->
+    <!-- ***************************************************************** -->
 
     <Property Id="FRAMEWORK20">
-      <RegistrySearch Id='Framework20Registry' Type='raw' Root='HKLM'
-                      Key='Software\Microsoft\.NETFramework\policy\v2.0' Name='50727' />
+      <RegistrySearch Id="Framework20Registry" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework\policy\v2.0" Name="50727" />
+    </Property>
+
+    <Property Id="FRAMEWORK40">
+      <RegistrySearch Id="Framework40Registry" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework\policy\v4.0" Name="30319" />
     </Property>
 
     <Property Id="MONODEFAULTCLR">
-      <RegistrySearch Id="MonoDefaultClr" Type='raw' Root='HKLM'
-                      Key='Software\Novell\Mono' Name='DefaultCLR' />
+      <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' />
+      <RegistrySearch Id="MonoDirectory" Type="directory" Root="HKLM" Key="Software\Novell\Mono\[MONODEFAULTCLR]" Name="SDKInstallRoot" />
     </Property>
 
-    <Property Id="CMD_EXE" Value="[!SystemFolder]cmd.exe"/>
+    <Property Id="CMD_EXE" Value="[!SystemFolder]cmd.exe" />
+
+    <!-- Set ALLUSERS to null, user may override by specifying
+         ALLUSERS=1 as part of the command line. -->
+    <Property Id="ALLUSERS" Secure="yes" />
 
     <!-- ***************************************************************** -->
     <!-- *********  Properties for the Add Remove Programs list  ********* -->
     <!-- ***************************************************************** -->
 
     <Property Id="ARPCONTACT" Value="Charlie Poole" />
-    <Property Id='ARPPRODUCTICON' Value='nunit_icon.exe'/>
+    <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="ARPREADME" Value="http://nunit.org/ p=releaseNotes&r=2.6" />
     <Property Id="ARPURLINFOABOUT" Value="NUnit is a testing framework for all .NET languages" />
     <Property Id="ARPURLUPDATEINFO" Value="http://nunit.org?p=download" />
 
@@ -66,40 +57,40 @@
 
     <Directory Id="TARGETDIR" Name="SourceDir">
 
-      <Directory Id='ProgramFilesFolder' Name='PFiles'>
+      <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 Id="INSTALLDIR" Name="NUnit $(var.NominalVersion)">
+
+          <Directory Id="bin" Name="bin">
+
+            <Directory Id="lib" Name="lib">
+              <Directory Id="Images" Name="Images">
+                <Directory Id="Tree" Name="Tree">
+                  <Directory Id="Circles" Name="Circles" />
+                  <Directory Id="Classic" Name="Classic" />
+                  <Directory Id="Default" Name="Default" />
+                  <Directory Id="VisualStudio" Name="Visual Studio" />
+                </Directory>
+              </Directory>
             </Directory>
+            <Directory Id="addins" Name="addins" />
+            <Directory Id="tests" Name="tests" />
+            <Directory Id="framework" Name="framework" />
 
           </Directory>
 
-          <Directory Id='doc' Name='doc'>
-            <Directory Id='files' Name='files' />
-            <Directory Id='img' Name='img' />
+          <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 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="Extensibility" />
           </Directory>
 
         </Directory>
@@ -107,12 +98,18 @@
       </Directory>
 
       <!-- Desktop Folder Directory for our Desktop Shortcut -->
-      <Directory Id="DesktopFolder" Name="." SourceName="DESKTOP" LongSource="User's Desktop" />
+      <Directory Id="DesktopFolder" Name="." SourceName="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="ProgramMenuFolder" Name=".">
+        <Directory Id="NUnitMenu" Name="NUnit $(var.NominalVersion)">
+          <Component Id="NUnitMenu">
+            <RemoveFolder Id="NUnitMenu" On="uninstall"/>
+            <RegistryValue Root="HKMU"
+          Key="SOFTWARE\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+              Type="integer" Name="NUnitMenu" Value="1" />
+          </Component>
+          <Directory Id="RunUnderMenu" Name="Select Runtime" />
           <Directory Id="SamplesMenu" Name="Samples" />
         </Directory>
       </Directory>
@@ -124,100 +121,141 @@
     <!-- **********      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">
+    <Feature Id="BaseFeature" ConfigurableDirectory="INSTALLDIR" Level="1" Title="NUnit $(var.NominalVersion)" Display="expand" Description="Installs the NUnit console runner and supporting assemblies required to write and run tests.">
+
+      <!-- Defined in this file -->
+      <ComponentRef Id="NUnitMenu" />
+
+      <!-- Defined in base.wxs -->
+      <ComponentRef Id="license.txt" />
+      <ComponentRef Id="Logo.ico" />
+      <ComponentRef Id="InstallationRegistryEntry" />
+      <ComponentRef Id="nunit.framework" />
+      <ComponentRef Id="nunit.mocks" />
+      <ComponentRef Id="AssemblyReferenceFolder" />
+      <ComponentRef Id="nunit.core" />
+      <ComponentRef Id="nunit.core.interfaces" />
+      <ComponentRef Id="nunit.util" />
+      <ComponentRef Id="AddinsFolder" />
+      <ComponentRef Id="nunit_console" />
+      <ComponentRef Id="nunit_console_x86" />
+      <ComponentRef Id="console.dll" />
+      <ComponentRef Id="nunit_agent" />
+      <ComponentRef Id="nunit_agent_x86" />
+
+      <Feature Id="GuiRunner" Level="1" Title="Gui Runner" Display="expand" Description="Installs the NUnit GUI runner.">
+
+        <!-- Defined in nunit-gui.wxs -->
+        <ComponentRef Id="nunit.exe" />
+        <ComponentRef Id="nunit_x86" />
+        <ComponentRef Id="nunit_gui_runner" />
+        <ComponentRef Id="nunit.uikit" />
+        <ComponentRef Id="CirclesImageSet" />
+        <ComponentRef Id="ClassicImageSet" />
+        <ComponentRef Id="DefaultImageSet" />
+        <ComponentRef Id="VisualStudioImageSet" />
+        <ComponentRef Id="nunit.uiexception.dll" />
+        <!--<ComponentRef Id="DllFileAssociation" />
+        <ComponentRef Id="NUnitProjectFileAssociation" />-->
+        <ComponentRef Id="MenuShortcut_NUnit" />
+        <ComponentRef Id="RunUnderMenu" />
+        <ComponentRef Id="MenuShortcut_2.0" />
+        <ComponentRef Id="MenuShortcut_Mono_2.0" />
+        <ComponentRef Id="nunit_editor.exe" />
+        <ComponentRef Id="EditorMenuShortcut" />
 
-      <!-- Defined below -->
-      <ComponentRef Id="C__LICENSE" />
-      <ComponentRef Id="C__FIT_LICENSE" />
-      <ComponentRef Id="C__LOGO" />
-      <ComponentRef Id="InstallationRegistryEntry"/>
+      </Feature>
 
-      <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>
+      <!-- Defined in pnunit.wxs -->
+      <Feature Id="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="Net_2.0_ConsoleRunnerGroup" />
+        <!-- Defined in pnunit.wxs -->
+        <ComponentRef Id="pnunit_agent" />
+        <ComponentRef Id="pnunit_launcher" />
+        <ComponentRef Id="pnunit_framework" />
+        <ComponentRef Id="log4net" />
 
       </Feature>
 
-      <Feature Id="Net_2.0_GuiRunner" Level="1" Title='Gui Runner' Display='expand'
-				         Description="Installs NUnit Windows GUI runner for .NET 2.0">
+      <Feature Id="TestsFeature" Level="10" Title="Unit Tests" Display="expand" Description="Installs the unit tests for NUnit itself.">
 
-        <ComponentGroupRef Id="Net_2.0_FrameworkGroup"/>
-        <ComponentGroupRef Id="Net_2.0_CoreGroup"/>
-        <ComponentGroupRef Id="Net_2.0_GuiRunnerGroup"/>
+        <!-- Defined in tests.wxs -->
+        <ComponentRef Id="NUnitTestProject" />
+        <ComponentRef Id="framework_copy_for_tests" />
+        <ComponentRef Id="base_tests" />
 
-      </Feature>
+        <!-- Defined in NSubstitute.wxs -->
+        <ComponentRef Id="NSubstitute" />
 
-      <Feature Id="Net_2.0_PNunitRunner" Level="10" Title='PNUnit Runner' Display='expand'
-               Description="Installs the PNUnit runner for parallel distributed tests">
+        <!-- Defined in pnunit.wxs -->
+        <ComponentRef Id="pnunit_tests" />
 
-        <ComponentGroupRef Id="Net_2.0_FrameworkGroup"/>
-        <ComponentGroupRef Id="Net_2.0_CoreGroup"/>
-        <ComponentGroupRef Id="pnunit_2.0"/>
+        <!-- Defined in nunit-gui.wxs -->
+        <ComponentRef Id="gui_tests" />
 
       </Feature>
 
-      <Feature Id="Net_2.0_TestsFeature" Level="10" Title='Unit Tests' Display='expand'
-				         Description='Unit tests for NUnit under .NET 1.1'>
+      <Feature Id="DocumentationFeature" Level="1" Title="Documentation" Display="expand" Description="Installs the NUnit documentation.">
 
-        <ComponentGroupRef Id="Net_2.0_TestsGroup" />
+        <!-- Defined in doc.wxs -->
+        <ComponentRef Id="HtmlDocs" />
+        <ComponentRef Id="DocFiles" />
+        <ComponentRef Id="DocImages" />
+        <ComponentRef Id="MenuShortcut_NUnitHelp"/>
 
       </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">
+      <!-- Defined in samples.wxs -->
+      <Feature Id="SamplesFeature" Level="1" Title="Samples" Display="collapse" Description="Installs sample code showing the use of NUnit.">
 
-          <ComponentGroupRef Id="Net_1.1_FrameworkGroup" />
+        <ComponentRef Id="C__SamplesCommon" />
+        <ComponentRef Id="C__SampleShortcuts" />
 
-        </Feature>
+        <Feature Id="CSharpSamples" Level="1" Title="C# Samples" Display="expand" Description="Installs C# samples.">
 
-        <Feature Id="Net_1.1_ConsoleRunner" Level="10" Title="Console Runner" Display="expand"
-				         Description="Installs NUnit console runner for .NET 1.1">
+          <ComponentRef Id="C__CSharp_Samples" />
+          <ComponentRef Id="C__CSharp_Failures" />
+          <ComponentRef Id="C__CSharp_Money" />
+          <ComponentRef Id="C__CSharp_Syntax" />
 
-          <ComponentGroupRef Id="Net_1.1_FrameworkGroup"/>
-          <ComponentGroupRef Id="Net_1.1_CoreGroup"/>
-          <ComponentGroupRef Id="Net_1.1_ConsoleRunnerGroup" />
+          <!-- 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" />
 
         </Feature>
 
-        <Feature Id="Net_1.1_PNUnitRunner" Level="10" Title='PNUnit Runner' Display='expand'
-                 Description="Installs the PNUnit runner for parallel distributed tests">
+        <Feature Id="VBSamples" Level="1" Title="Visual Basic Samples" Display="expand" Description="Installs Visual Basic samples.">
 
-          <ComponentGroupRef Id="pnunit_1.1"/>
+          <ComponentRef Id="C__VB_Samples" />
+          <ComponentRef Id="C__VB_Failures" />
+          <ComponentRef Id="C__VB_Money" />
+          <ComponentRef Id="C__VB_Syntax" />
 
         </Feature>
 
-        <Feature Id="Net_1.1_TestsFeature" Level="10" Title='Unit Tests' Display='expand'
-				         Description='Unit tests for NUnit under .NET 1.1' >
+        <Feature Id="JSharpSamples" Level="1" Title="J# Samples" Display="expand" Description="Installs J# samples.">
 
-          <ComponentGroupRef Id="Net_1.1_TestsGroup" />
+          <ComponentRef Id="C__JSharp_Samples" />
+          <ComponentRef Id="C__JSharp_Failures" />
 
         </Feature>
 
-      </Feature>
-
-      <Feature Id="DocumentationFeature" Level="1" Title='Documentation' Display='expand'
-			         Description="HTML documentation for NUNit">
-
-        <ComponentGroupRef Id="DocumentationComponents"/>
-
-      </Feature>
+        <Feature Id="CPPSamples" Level="1" Title="C++ Samples" Display="expand" Description="Installs C++ samples.">
 
+          <!-- Managed C++ Samples -->
+          <ComponentRef Id="C__CPP_Managed_Samples" />
+          <ComponentRef Id="C__CPP_Managed_Failures" />
 
-      <!-- Defined in samples.wxs -->
-      <Feature Id="SamplesFeature" Level="1" Title='Samples' Display='expand'
-               Description='Sample code showing the use of NUnit' >
+          <!-- C++/CLI Samples -->
+          <ComponentRef Id="C__CPP_CLI_Samples" />
+          <ComponentRef Id="C__CPP_CLI_Failures" />
+          <ComponentRef Id="C__CPP_CLI_Syntax" />
 
-        <ComponentGroupRef Id="SampleComponents"/>
+        </Feature>
 
       </Feature>
 
@@ -234,39 +272,7 @@
     <!--<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>
+    <Icon Id="nunit_icon.exe" SourceFile="Logo.ico" />
 
   </Product>
 </Wix>
\ No newline at end of file
diff --git a/install/bin.wxs b/install/bin.wxs
deleted file mode 100644
index 4f6b4fc..0000000
--- a/install/bin.wxs
+++ /dev/null
@@ -1,196 +0,0 @@
-<?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
index ace1774..e03c80b 100644
--- a/install/doc.wxs
+++ b/install/doc.wxs
@@ -1,165 +1,187 @@
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/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">
+
+      <Component Id="HtmlDocs" Guid="B94DA2CD-CB19-43b6-8DE4-E588C7EA8A49">
+
         <File Id="nunit.css" Name="nunit.css" />
-        <File Id="codeFuncs.js" Name="CODEFNCS.JS" LongName="codeFuncs.js" />
+        <File Id="codeFuncs.js" Name="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" />
+        <File Id="actionAttributes.html" Name="actionAttributes.html" />
+        <File Id="addinsDialog.html" Name="addinsDialog.html" />
+        <File Id="assemblyIsolation.html" Name="assemblyIsolation.html" />
+        <File Id="assertions.html" Name="assertions.html" />
+        <File Id="attributes.html" Name="attributes.html" />
+        <File Id="category.html" Name="category.html" />
+        <File Id="collectionAssert.html" Name="collectionAssert.html" />
+        <File Id="collectionConstraints.html"
+              Name="collectionConstraints.html" />
+        <File Id="combinatorial.html" Name="combinatorial.html" />
+        <File Id="comparisonAsserts.html" Name="comparisonAsserts.html" />
+        <File Id="comparisonConstraints.html"
+              Name="comparisonConstraints.html" />
+        <File Id="compoundConstraints.html" Name="compoundConstraints.html" />
+        <File Id="conditionAsserts.html" Name="conditionAsserts.html" />
+        <File Id="conditionConstraints.html"
+              Name="conditionConstraints.html" />
+        <File Id="configEditor.html" Name="configEditor.html" />
+        <File Id="configFiles.html" Name="configFiles.html" />
+        <File Id="consoleCommandLine.html" Name="consoleCommandLine.html" />
+        <File Id="constraintModel.html" Name="constraintModel.html" />
+        <File Id="contextMenu.html" Name="contextMenu.html" />
+        <File Id="culture.html" Name="culture.html" />
+        <File Id="customConstraints.html" Name="customConstraints.html" />
+        <File Id="datapoint.html" Name="datapoint.html" />
+        <File Id="datapointProviders.html" Name="datapointProviders.html" />
+        <File Id="delayedConstraint.html" Name="delayedConstraint.html" />
+        <File Id="description.html" Name="description.html" />
+        <File Id="directoryAssert.html" Name="directoryAssert.html" />
+        <File Id="equalConstraint.html" Name="equalConstraint.html" />
+        <File Id="equalityAsserts.html" Name="equalityAsserts.html" />
+        <File Id="eventListeners.html" Name="eventListeners.html" />
+        <File Id="exception.html" Name="exception.html" />
+        <File Id="exceptionAsserts.html" Name="exceptionAsserts.html" />
+        <File Id="explicit.html" Name="explicit.html" />
+        <File Id="extensibility.html" Name="extensibility.html" />
+        <File Id="extensionTips.html" Name="extensionTips.html" />
+        <File Id="fileAssert.html" Name="fileAssert.html" />
+        <File Id="fixtureSetup.html" Name="fixtureSetup.html" />
+        <File Id="fixtureTeardown.html" Name="fixtureTeardown.html" />
+        <File Id="getStarted.html" Name="getStarted.html" />
+        <File Id="guiCommandLine.html" Name="guiCommandLine.html" />
+        <File Id="identityAsserts" Name="identityAsserts.html" />
+        <File Id="ignore.html" Name="ignore.html" />
+        <File Id="index.html" Name="index.html" />
+        <File Id="installation.html" Name="installation.html" />
+        <File Id="license.html" Name="license.html" />
+        <File Id="listMapper.html" Name="listMapper.html" />
+        <File Id="mainMenu.html" Name="mainMenu.html" />
+        <File Id="maxtime.html" Name="maxtime.html" />
+        <File Id="multiAssembly.html" Name="multiAssembly.html" />
+        <File Id="nunit_agent.html" Name="nunit-agent.html" />
+        <File Id="nunit_console.html" Name="nunit-console.html" />
+        <File Id="nunit_gui.html" Name="nunit-gui.html" />
+        <File Id="nunitAddins.html" Name="nunitAddins.html" />
+        <File Id="pairwise.html" Name="pairwise.html" />
+        <File Id="parameterizedTests.html" Name="parameterizedTests.html" />
+        <File Id="pathConstraints.html" Name="pathConstraints.html" />
+        <File Id="platform.html" Name="platform.html" />
+        <File Id="pnunit.html" Name="pnunit.html" />
+        <File Id="projectEditor.html" Name="projectEditor.html" />
+        <File Id="property.html" Name="property.html" />
+        <File Id="propertyConstraint.html" Name="propertyConstraint.html" />
+        <File Id="quickstart.html" Name="quickStart.html" />
+        <File Id="random.html" Name="random.html" />
+        <File Id="range.html" Name="range.html" />
+        <File Id="releaseBreakdown.html" Name="releaseBreakdown.html" />
+        <File Id="releaseNotes.html" Name="releaseNotes.html" />
+        <File Id="repeat.html" Name="repeat.html" />
+        <File Id="requiredAddin.html" Name="requiredAddin.html" />
+        <File Id="requiresMTA.html" Name="requiresMTA.html" />
+        <File Id="requiresSTA.html" Name="requiresSTA.html" />
+        <File Id="requiresThread.html" Name="requiresThread.html" />
+        <File Id="reusableConstraint.html" Name="reusableConstraint.html" />
+        <File Id="runningTests.html" Name="runningTests.html" />
+        <File Id="runtimeSelection.html" Name="runtimeSelection.html" />
+        <File Id="sameasConstraint.html" Name="sameasConstraint.html" />
+        <File Id="samples.html" Name="samples.html" />
+        <File Id="sequential.html" Name="sequential.html" />
+        <File Id="setCulture.html" Name="setCulture.html" />
+        <File Id="setUICulture.html" Name="setUICulture.html" />
+        <File Id="settingsDialog.html" Name="settingsDialog.html" />
+        <File Id="setup.html" Name="setup.html" />
+        <File Id="setupFixture.html" Name="setupFixture.html" />
+        <File Id="stringAssert.html" Name="stringAssert.html" />
+        <File Id="stringConstraints.html" Name="stringConstraints.html" />
+        <File Id="suite.html" Name="suite.html" />
+        <File Id="suiteBuilders.html" Name="suiteBuilders.html" />
+        <File Id="teardown.html" Name="teardown.html" />
+        <File Id="test.html" Name="test.html" />
+        <File Id="testCase.html" Name="testCase.html" />
+        <File Id="testcaseBuilders.html" Name="testcaseBuilders.html" />
+        <File Id="testcaseProviders.html" Name="testcaseProviders.html" />
+        <File Id="testCaseSource.html" Name="testCaseSource.html" />
+        <File Id="testContext.html" Name="testContext.html" />
+        <File Id="testDecorators.html" Name="testDecorators.html" />
+        <File Id="testFixture.html" Name="testFixture.html" />
+        <File Id="testProperties.html" Name="testProperties.html" />
+        <File Id="theory.html" Name="theory.html" />
+        <File Id="throwsConstraint.html" Name="throwsConstraint.html" />
+        <File Id="timeout.html" Name="timeout.html" />
+        <File Id="typeAsserts.html" Name="typeAsserts.html" />
+        <File Id="typeConstraints.html" Name="typeConstraints.html" />
+        <File Id="upgrade.html" Name="upgrade.html" />
+        <File Id="utilityAsserts.html" Name="utilityAsserts.html" />
+        <File Id="values.html" Name="values.html" />
+        <File Id="valueSource.html" Name="valueSource.html" />
+        <File Id="vsSupport.html" Name="vsSupport.html" />
+        <File Id="vsTestAdapterLicense.html" Name="vsTestAdapterLicense.html" />
+        <File Id="vsTestAdapter.html" Name="vsTestAdapter.html" />
+        <File Id="writingTests.html" Name="writingTests.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" />
+
+    <DirectoryRef Id="files" FileSource="doc\files">
+      <Component Id="DocFiles" Guid="F054972E-63F6-4596-AFD5-A029648C59B5">
+        <File Id="F__doc_file70" Name="QuickStart.doc" />
+        <File Id="F__doc_file71" Name="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" />
+        <File Id="F__doc_file73" Name="Summary.xslt" />
+        <File Id="F__doc_file75" Name="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" />
+      <Component Id="DocImages" Guid="27F9B183-519D-416a-9019-8BDA50D6684B">
+        <File Id="addinsDialog.jpg" Name="addinsDialog.jpg" />
+        <File Id="advancedSettings.jpg" Name="advancedSettings.jpg" />
+        <File Id="assemblyReloadSettings.jpg"
+              Name="assemblyReloadSettings.jpg" />
+        <File Id="assembliesTab.jpg" Name="assembliesTab.jpg" />
+        <File Id="bulletOff.gif" Name="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="configEditor.jpg" Name="configEditor.jpg" />
+        <File Id="console_mock.jpg" Name="console-mock.jpg" />
+        <File Id="generalSettings.jpg" Name="generalSettings.jpg" />
+        <File Id="generalTab.jpg" Name="generalTab.jpg" />
+        <File Id="gui_screenshot.jpg" Name="gui-screenshot.jpg" />
+        <File Id="gui_verify.jpg" Name="gui-verify.jpg" />
+        <File Id="internalTraceSettings.jpg"
+              Name="internalTraceSettings.jpg" />
+        <File Id="langFilter.gif" Name="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" />
+        <File Id="nunitTestAdapter.png" Name="nunitTestAdapter.png" />
+        <File Id="testProperties.jpg" Name="testProperties.jpg" />
+        <File Id="testLoadSettings.jpg" Name="testLoadSettings.jpg" />
+        <File Id="testResultSettings.jpg" Name="testResultSettings.jpg" />
+        <File Id="textOutputSettings.jpg" Name="textOutputSettings.jpg" />
+        <File Id="treeDisplaySettings.jpg" Name="treeDisplaySettings.jpg" />
+        <File Id="visualStudioSettings.jpg" Name="visualStudioSettings.jpg" />
         <RemoveFile Id="RemoveThumbnails_Doc_Img" Name="*" On="uninstall" />
       </Component>
     </DirectoryRef>
-	
+
+    <DirectoryRef Id="NUnitMenu">
+
+      <Component Id="MenuShortcut_NUnitHelp"
+                 Guid="782BEE83-3E79-474a-A8C0-E63A4C38E807">
+        <Shortcut Id="MenuShortcut_NUnitHelp"
+                  Name="Documentation"
+                  Target="[!index.html]"
+                  Advertise="no"
+                  Show="normal"
+                  WorkingDirectory="doc" />
+        <RegistryValue Root = "HKCU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="Documentation" Type="integer" Value="1" KeyPath="yes"/>
+      </Component>
+
+    </DirectoryRef>
+
   </Fragment>
 </Wix>
diff --git a/install/nunit-gui.wxs b/install/nunit-gui.wxs
index bfd1b39..77baae0 100644
--- a/install/nunit-gui.wxs
+++ b/install/nunit-gui.wxs
@@ -1,117 +1,230 @@
 <?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" />
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+  <Fragment>
+
+    <DirectoryRef Id="bin" FileSource="bin">
+
+      <Component Id="nunit.exe" Guid="9845C9CA-2C57-4445-892D-1080FE6F29BD">
+        <File Id="nunit.exe" Name="nunit.exe" />
+        <File Id="nunit.config" Name="nunit.exe.config" />
+        <RegistryValue Root="HKCR"
+                       Key=".dll\OpenWithList\nunit.exe"
+                       Type="string"
+                       Value="" />
+        <RegistryValue Root="HKCR"
+                       Key="dllfile\shell\OpenWithNUnit"
+                       Action="write"
+                       Type="string"
+                       Value="Run &Tests" />
+        <RegistryValue Root="HKCR"
+                       Key="dllfile\shell\OpenWithNUnit\command"
+                       Action="write"
+                       Type="string"
+                       Value=""[#nunit.exe]" "%1"" />
+        <RegistryValue Root="HKCR"
+                       Key=".nunit"
+                       Action="write"
+                       Type="string"
+                       Value="NUnitTestProject" />
+        <RegistryValue Root="HKCR"
+                       Key="NUnitTestProject"
+                       Action="write"
+                       Type="string"
+                       Value="NUnit Test Project" />
+        <RegistryValue Root="HKCR"
+                       Key="NUnitTestProject\DefaultIcon"
+                       Action="write"
+                       Type="string"
+                       Value="[#nunit.exe],0" />
+        <RegistryValue Root="HKCR"
+                       Key="NUnitTestProject\shell\Open"
+                       Action="write" Type="string"
+                       Value="&Open" />
+        <RegistryValue Root="HKCR"
+                       Key="NUnitTestProject\shell\Open\command"
+                       Action="write"
+                       Type="string"
+                       Value=""[#nunit.exe]" "%1"" />
+      </Component>
+
+      <Component Id="nunit_x86" Guid="0F8FCF59-E264-4062-B0AB-B79ED1235BD9">
+        <File Id="nunit_x86.exe" Name="nunit-x86.exe" />
+        <File Id="nunit_x86.config" Name="nunit-x86.exe.config" />
       </Component>
-    		     				
+
+      <Component Id="nunit_editor.exe">
+        <File Id="nunit_editor.exe" Name="nunit-editor.exe" />
+        <RegistryValue Root="HKCR"
+                       Key="NUnitTestProject\shell\Edit"
+                       Action="write" Type="string"
+                       Value="&Edit" />
+        <RegistryValue Root="HKCR"
+                       Key="NUnitTestProject\shell\Edit\command"
+                       Action="write"
+                       Type="string"
+                     Value=""[#nunit_editor.exe]" "%1"" />
+      </Component>
+
     </DirectoryRef>
 
-    <DirectoryRef Id="lib_2.0" FileSource="bin\net-2.0\lib">
+    <DirectoryRef Id="lib" FileSource="bin\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 Id="nunit_gui_runner">
+        <File Id="nunit_gui_runner" Name="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 Id="nunit.uikit">
+        <File Id="nunit.uikit" Name="nunit.uikit.dll" />
+        <RemoveFile Id="RemoveThumbnails_GUI" 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 Id="nunit.uiexception.dll">
+        <File Id="nunit.uiexception.dll" Name="nunit.uiexception.dll" />
       </Component>
-      		
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="Circles" FileSource="bin\lib\Images\Tree\Circles">
+
+      <Component Id="CirclesImageSet"
+                 Guid="90F2E35F-E65E-409d-ACE3-8A99E6D1369C">
+        <File Id="circles_skipped" Name="skipped.jpg" />
+        <File Id="circles_success" Name="success.jpg" />
+        <File Id="circles_failure" Name="failure.jpg" />
+        <File Id="circles_ignored" Name="ignored.jpg" />
+        <File Id="circles_inconclusive" Name="inconclusive.jpg" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="Classic" FileSource="bin\lib\Images\Tree\Classic">
+
+      <Component Id="ClassicImageSet"
+                 Guid="A5EE8820-8209-462a-9D49-58D4CE0347C3">
+        <File Id="classic_skipped" Name="skipped.jpg" />
+        <File Id="classic_success" Name="success.jpg" />
+        <File Id="classic_failure" Name="failure.jpg" />
+        <File Id="classic_ignored" Name="ignored.jpg" />
+        <File Id="classic_inconclusive" Name="inconclusive.jpg" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="Default" FileSource="bin\lib\Images\Tree\Default">
+
+      <Component Id="DefaultImageSet"
+                 Guid="76133AEB-8245-4e46-8C2D-FB9C3F0682C6">
+        <File Id="default_skipped" Name="skipped.png" />
+        <File Id="default_success" Name="success.png" />
+        <File Id="default_failure" Name="failure.png" />
+        <File Id="default_ignored" Name="ignored.png" />
+        <File Id="default_inconclusive" Name="inconclusive.png" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="VisualStudio" FileSource="bin\lib\Images\Tree\Visual Studio">
+
+      <Component Id="VisualStudioImageSet"
+                 Guid="8143B7BB-9B4C-4b25-81B3-4FAF0F14B3EF">
+        <File Id="vs_skipped" Name="skipped.png" />
+        <File Id="vs_success" Name="success.png" />
+        <File Id="vs_failure" Name="failure.png" />
+        <File Id="vs_ignored" Name="ignored.png" />
+        <File Id="vs_inconclusive.png" Name="inconclusive.png" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="tests" FileSource="bin\tests">
+
+      <Component Id="gui_tests"
+                 Guid="7AA78B1B-62AA-457c-BFCC-D9D661C9AE9E">
+        <File Id="nunit.uikit.tests" Name="nunit.uikit.tests.dll" />
+        <File Id="nunit.uiexception.tests.dll"               Name="nunit.uiexception.tests.dll" />
+        <File Id="gui.tests" Name="nunit-gui.tests.dll" />
+        <File Id="nunit_editor_tests" Name="nunit-editor.tests.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="NUnitMenu">
+
+      <!-- ICE69 Error on this component can be ignored -->
+      <Component Id="MenuShortcut_NUnit">
+        <Shortcut Id="MenuShortcut_NUnit"
+                  Name="NUnit"
+                  Target="[#nunit.exe]"
+                  Advertise="no"
+                  Icon="nunit_icon.exe"
+                  IconIndex="0"
+                  Show="normal"
+                  WorkingDirectory="bin" />
+        <RegistryValue Root = "HKCU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="NUnitShortcut" Type="integer" Value="1" KeyPath="yes" />
+      </Component>
+
+      <!-- ICE69 Error on this component can be ignored -->
+      <Component Id="EditorMenuShortcut">
+        <Shortcut Id="EditorMenuShortcut"
+                  ShortName="Editor"
+                  Name="Project Editor"
+                  Target="[#nunit_editor.exe]"
+                  Advertise="no"
+                  Icon="nunit_icon.exe"
+                  IconIndex="0"
+                  Show="normal"
+                  WorkingDirectory="bin" />
+        <RegistryValue Root = "HKCU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="ProjectEditorShortcut" Type="integer" Value="1" KeyPath="yes"/>
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="RunUnderMenu">
+
+      <Component Id="RunUnderMenu">
+        <RemoveFolder Id="RunUnderMenu" On="uninstall"/>
+        <RegistryValue Root="HKMU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="RunUnderMenu" Type="integer" Value="1" KeyPath="yes" />
+      </Component>
+
+      <!-- ICE69 Error on this component can be ignored -->
+      <Component Id="MenuShortcut_2.0">
+        <Condition>FRAMEWORK20</Condition>
+        <Shortcut Id="MenuShortcut_2.0"
+                  Name="NUnit (.NET)"
+                  Target="[#nunit.exe]"
+                  Advertise="no"
+                  Icon="nunit_icon.exe"
+                  IconIndex="0"
+                  Show="normal"
+                  WorkingDirectory="bin" />
+        <RegistryValue Root = "HKCU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="NUnitUnderNetShortcut" Type="integer" Value="1" KeyPath="yes"/>
+      </Component>
+
+      <Component Id="MenuShortcut_Mono_2.0">
+        <Condition>MONODIRECTORY</Condition>
+        <Shortcut Id="MenuShortcut_Mono_2.0"
+                  Name="NUnit (Mono)"
+                  Target="[MONODIRECTORY]bin\mono.exe"
+                  Arguments="nunit.exe"
+                  Advertise="no"
+                  Icon="nunit_icon.exe"
+                  IconIndex="0"
+                  Show="normal"
+                  WorkingDirectory="bin" />
+        <RegistryValue Root = "HKCU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="NUnitUnderMonoShortcut" Type="integer" Value="1" />
+      </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
index c953008..2ecb2a7 100644
--- a/install/samples.wxs
+++ b/install/samples.wxs
@@ -1,263 +1,284 @@
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+<?xml version="1.0" encoding="utf-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/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 -->	
+    <!-- Menu Shortcuts to samples -->
+    <DirectoryRef Id="samples" FileSource="$(var.InstallImage)\samples">
+
+      <Component Id="C__SamplesCommon"
+                 Guid="9FBE1436-920F-450b-9E7E-D85473E727B4">
+        <File Id="ReadMe.txt" Name="ReadMe.txt" />
+        <File Id="samples.common" Name="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 Id="C__CSharp_Samples">
+        <File Id="CSharp.sln" Name="CSharp.sln" />
+      </Component>
+
+      <Directory Id="csharp_failures" Name="failures">
+        <Component Id="C__CSharp_Failures"
+                   Guid="A80777F0-BAF4-4e68-B248-15E811041B87">
+          <File Id="CS_Failures.csproj" Name="cs-failures.csproj" />
+          <File Id="CS_Failures.build" Name="cs-failures.build" />
+          <File Id="CSharpTest.cs" Name="CSharpTest.cs" />
+          <File Id="CS_Failures_AssemblyInfo.cs" Name="AssemblyInfo.cs" />
         </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>
-        
+      </Directory>
+
+      <Directory Id="csharp_money" Name="money">
+        <Component Id="C__CSharp_Money"
+                   Guid="F7B5ED7B-7478-43d3-B376-06FE70EADF1B">
+          <File Id="CS_Money.cs" Name="Money.cs" />
+          <File Id="CS_MoneyTest.cs" Name="MoneyTest.cs" />
+          <File Id="CS_MoneyBag.cs" Name="MoneyBag.cs" />
+          <File Id="CS_Money_AssemblyInfo.cs" Name="AssemblyInfo.cs" />
+          <File Id="CS_Money.csproj" Name="cs-money.csproj" />
+          <File Id="CS_Money.build" Name="cs-money.build" />
+          <File Id="CS_IMoney.cs" Name="IMoney.cs" />
+        </Component>
+      </Directory>
+
+      <Directory Id="csharp_syntax" Name="syntax">
+        <Component Id="C__CSharp_Syntax"
+                   Guid="5613D9D2-7F4B-4d49-A0C3-AEF43CF08C5B">
+          <File Id="CS_Syntax.csproj" Name="cs-syntax.csproj" />
+          <File Id="CS_Syntax.build" Name="cs-syntax.build" />
+          <File Id="CS_AssertSyntaxTests.cs" Name="AssertSyntaxTests.cs" />
+          <File Id="CS_Syntax_AssemblyInfo.cs" Name="AssemblyInfo.cs" />
+        </Component>
+      </Directory>
+
     </DirectoryRef>
-		
+
     <!-- J# Samples -->
-    <DirectoryRef Id="jsharp" FileSource="$(var.InstallImage)\samples\jsharp" >
+    <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>
+      <Component Id="C__JSharp_Samples">
+        <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>
+      <Directory Id="jsharp_failures" Name="failures">
+        <Component Id="C__JSharp_Failures"
+                   Guid="500ED4A5-E644-473d-904E-CD43D423531B">
+          <File Id="JS_Failures.vjsproj" Name="jsharp-failures.vjsproj" />
+          <File Id="JS_Failures.build" Name="jsharp-failures.build" />
+          <File Id="JS_JSharpTest.jsl" Name="JSharpTest.jsl" />
+          <File Id="JS_Failures_AssemblyInfo.jsl" Name="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" >
+    <DirectoryRef Id="cpp" FileSource="$(var.InstallImage)\samples\cpp">
+
+      <!-- Managed C++ -->
+      <Directory Id="cpp_managed" Name="managed">
 
-        <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 Id="C__CPP_Managed_Samples">
+          <File Id="managed_cpp.sln" Name="managed-cpp.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" />
+
+        <Directory Id="cpp_managed_failures" Name="failures">
+          <Component Id="C__CPP_Managed_Failures"
+                     Guid="A32EB24D-F996-4fc6-9614-D6CD17D0EAC6">
+            <File Id="F__samples_file46" Name="cppsample.h" />
+            <File Id="F__samples_file47" Name="cppsample.cpp" />
+            <File Id="CPP_Failures.vcproj"
+                  Name="cpp-managed-failures.vcproj" />
+            <File Id="CPP_Failures.build" Name="cpp-managed-failures.build" />
+            <File Id="F__samples_file50" Name="AssemblyInfo.cpp" />
           </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>
+
+      <!-- C++/CLI -->
+      <Directory Id="cpp_cli" Name="cpp-cli">
+
+        <Component Id="C__CPP_CLI_Samples">
+          <File Id="CPP_CLI.sln" Name="cpp-cli.sln" />
+        </Component>
+
+        <Directory Id="cpp_cli_failures" Name="failures">
+          <Component Id="C__CPP_CLI_Failures"
+                     Guid="9E073533-6798-42e6-8AF2-F619BB358416">
+            <File Id="CPP_CLI_Failures.h" Name="cppsample.h" />
+            <File Id="CPP_CLI_Failures.cpp" Name="cppsample.cpp" />
+            <File Id="CPP_CLI_Failures.vcproj"
+                  Name="cpp-cli-failures.vcproj" />
+            <File Id="CPP_CLI_Failures.build" Name="cpp-cli-failures.build" />
+            <File Id="CPP_CLI_Failures_AssemblyInfo" Name="AssemblyInfo.cpp" />
+          </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 Id="cpp_cli_syntax" Name="syntax">
+          <Component Id="C__CPP_CLI_Syntax"
+                     Guid="30A34CDA-7A71-48dd-8DC9-6D18EAECB49C">
+            <File Id="CPP_CLI_Syntax.cpp" Name="cpp-cli-syntax.cpp" />
+            <File Id="CPP_CLI_Syntax.vcproj" Name="cpp-cli-syntax.vcproj" />
+            <File Id="CPP_CLI_Syntax.build" Name="cpp-cli-syntax.build" />
+            <File Id="CPP_CLI_Syntax_AssemblyInfo" Name="AssemblyInfo.cpp" />
+          </Component>
         </Directory>
-        
+
+      </Directory>
+
+    </DirectoryRef>
+
+    <!-- VB Samples -->
+    <DirectoryRef Id="vb" FileSource="$(var.InstallImage)\samples\vb">
+
+      <Component Id="C__VB_Samples">
+        <File Id="vb_samples.sln" Name="vb-samples.sln" />
+      </Component>
+
+      <Directory Id="vb_failures" Name="failures">
+        <Component Id="C__VB_Failures"
+                   Guid="05434C61-C0AC-47cb-8189-B1232CA3B5FB">
+          <File Id="vb_failures.vbproj" Name="vb-failures.vbproj" />
+          <File Id="vb_failures.build" Name="vb-failures.build" />
+          <File Id="vb_failures.vb" Name="SimpleVBTest.vb" />
+          <File Id="vb_failures_assemblyinfo.vb" Name="AssemblyInfo.vb" />
+        </Component>
+      </Directory>
+
+      <Directory Id="vb_money" Name="money">
+        <Component Id="C__VB_Money"
+                   Guid="AB0D542C-670D-473c-9034-1D277466E60A">
+          <File Id="Money.vbproj" Name="vb-money.vbproj" />
+          <File Id="VB_Money.build" Name="vb-money.build" />
+          <File Id="Money.vb" Name="Money.vb" />
+          <File Id="MoneyTest.vb" Name="MoneyTest.vb" />
+          <File Id="MoneyBag.vb" Name="MoneyBag.vb" />
+          <File Id="Money_AssemblyInfo.vb" Name="AssemblyInfo.vb" />
+          <File Id="IMoney.vb" Name="IMoney.vb" />
+        </Component>
+      </Directory>
+
+      <Directory Id="vb_syntax" Name="syntax">
+        <Component Id="C__VB_Syntax"
+                   Guid="036CD103-788B-40c4-8AA3-467F9975E0E0">
+          <File Id="VB_Syntax.vbproj" Name="vb-syntax.vbproj" />
+          <File Id="VB_Syntax.build" Name="vb-syntax.build" />
+          <File Id="VB_AssertSyntaxTests.vb" Name="AssertSyntaxTests.vb" />
+          <File Id="VB_Syntax_AssemblyInfo.vb" Name="AssemblyInfo.vb" />
+        </Component>
+      </Directory>
+
     </DirectoryRef>
-	
+
     <!-- Extensibility Samples -->
-    <DirectoryRef Id="extensibility" FileSource="$(var.InstallImage)\samples\Extensibility" >
+    <DirectoryRef Id="extensibility"
+                  FileSource="$(var.InstallImage)\samples\Extensibility">
 
-        <Directory Id="core_extensibility" Name="Core">
+      <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>
+        <Component Id="C__CoreExtensibility">
+          <File Id="CoreExtensibility.sln" Name="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" />
+          <Component Id="C__MinimalAddin"
+                     Guid="7C9C8B34-5318-450b-8DCC-6D256C1259A1">
+            <File Id="Minimal.csproj" Name="Minimal.csproj" />
+            <File Id="Minimal.build" Name="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">
+        <Directory Id="samplesuiteextension" Name="SampleSuiteExtension">
+          <Component Id="C__SampleSuiteExtension"
+                     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" />
+            <File Id="SampleSuiteExtensionBuilder.cs"
+                  Name="SampleSuiteExtensionBuilder.cs" />
+            <File Id="SampleSuiteExtension.csproj"
+                  Name="SampleSuiteExtension.csproj" />
+            <File Id="SampleSuiteExtension.build"
+                  Name="SampleSuiteExtension.build" />
+            <File Id="SampleSuiteExtensionAttribute.cs"
+                  Name="SampleSuiteExtensionAttribute.cs" />
+            <File Id="SSX_AssemblyInfo.cs" Name="AssemblyInfo.cs" />
+            <File Id="SampleSuiteExtension.cs"
+                  Name="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>
+            <Component Id="C__SampleSuiteExtension_Tests"
+                       Guid="0E72B102-06A7-448d-938E-3EDD83BA496C">
+              <File Id="SampleSuiteExtensionTests.csproj"
+                    Name="SampleSuiteExtensionTests.csproj" />
+              <File Id="SampleSuiteExtensionTests.cs"
+                    Name="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" />
+        <Directory Id="samplefixtureextension" Name="SampleFixtureExtension">
+          <Component Id="C__SampleFixtureExtension"
+                     Guid="4C209669-C278-4fc7-8D61-3E36E263AADF">
+            <File Id="SampleFixtureExtensionBuilder.cs"
+                  Name="SampleFixtureExtensionBuilder.cs" />
+            <File Id="SampleFixtureExtension.cs"
+                  Name="SampleFixtureExtension.cs" />
+            <File Id="SampleFixtureExtensionAttribute.cs"
+                  Name="SampleFixtureExtensionAttribute.cs" />
+            <File Id="SampleFixtureExtension.csproj"
+                  Name="SampleFixtureExtension.csproj" />
+            <File Id="SampleFixtureExtension.build"
+                  Name="SampleFixtureExtension.build" />
+            <File Id="SFX_AssemblyInfo.cs" Name="AssemblyInfo.cs" />
+          </Component>
+
+          <Directory Id="SFX_Tests" Name="Tests">
+            <Component Id="C__SampleFixtureExtension_Tests"
+                       Guid="7A8AF9BF-EE33-462f-AE7F-2CEF2084866F">
+              <File Id="SampleFixtureExtensionTests.cs"
+                    Name="SampleFixtureExtensionTests.cs" />
+              <File Id="SampleFixtureExtensionTests.csproj" 
+                    Name="SampleFixtureExtensionTests.csproj" />
             </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>
+      </Directory>
     </DirectoryRef>
-		
+
+    <DirectoryRef Id="SamplesMenu">
+
+      <Component Id="C__SampleShortcuts">
+        <Shortcut Id="S__csharp"
+                  Target="[csharp]"
+                  Name="C#"
+                  Show="normal" />
+        <Shortcut Id="S__jsharp"
+                  Target="[jsharp]"
+                  Name="J#"
+                  Show="normal" />
+        <Shortcut Id="S__cpp"
+                  Target="[cpp]"
+                  Name="C++"
+                  Show="normal" />
+        <Shortcut Id="S__vb"
+                  Target="[vb]"
+                  Name="VB"
+                  Show="normal" />
+        <Shortcut Id="S__extensibility"
+                  Target="[extensibility]"
+                  Name="Extensibility"
+                  Show="normal" />
+        <RegistryValue Root = "HKCU"
+          Key="Software\[Manufacturer]\NUnit\$(var.NominalVersion)\Shortcuts"
+          Name="Samples" Type="integer" Value="1" KeyPath="yes"/>
+        <RemoveFolder Id="RemoveSamplesMenuFolder"
+                      On="uninstall"/>
+      </Component>
+
+    </DirectoryRef>
+
   </Fragment>
 </Wix>
\ No newline at end of file
diff --git a/install/tests.wxs b/install/tests.wxs
index 57f2249..8270e3e 100644
--- a/install/tests.wxs
+++ b/install/tests.wxs
@@ -1,125 +1,36 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/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>
+    <DirectoryRef Id="bin" FileSource="bin">
 
-      <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 Id="NUnitTestProject"
+                 Guid="6670EEC9-2B3C-4c1f-A91C-BD0EDA0E8B12">
+        <File Id="NUnitTests.nunit" Name="NUnitTests.nunit" />
+        <File Id="NUnitTests.config" Name="NUnitTests.config" />
       </Component>
 
     </DirectoryRef>
 
-    <DirectoryRef Id="lib_1.1" FileSource="bin\net-1.1\lib">
+    <DirectoryRef Id="tests" FileSource="bin\tests">
 
-      <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 Id="framework_copy_for_tests">
+        <File Id="nunit.framework.copy" Name="nunit.framework.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 Id="base_tests" Guid="85DD0370-9E05-4e9a-8AB4-02A6C24986AB">
+        <File Id="testutilities" Name="test-utilities.dll" />
+        <File Id="testassembly" Name="test-assembly.dll" />
+        <File Id="mockassembly" Name="mock-assembly.dll" />
+        <File Id="nonamespaceassembly" Name="nonamespace-assembly.dll" />
+        <File Id="nunit.util.tests" Name="nunit.util.tests.dll" />
+        <File Id="nunit.framework.tests" Name="nunit.framework.tests.dll" />
+        <File Id="nunit.mocks.tests" Name="nunit.mocks.tests.dll" />
+        <File Id="console.tests" Name="nunit-console.tests.dll" />
+        <File Id="nunit.core.tests" Name="nunit.core.tests.dll" />
       </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/lib/3.5/NSubstitute.xml b/lib/3.5/NSubstitute.xml
new file mode 100644
index 0000000..ca1bd9d
--- /dev/null
+++ b/lib/3.5/NSubstitute.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>NSubstitute</name>
+    </assembly>
+    <members>
+        <member name="M:NSubstitute.Raise.EventWith``1(System.Object,``0)">
+            <summary>
+            Raise an event for an <c>EventHandler<TEventArgs></c> event with the provided <paramref name="sender"/> and <paramref name="eventArgs"/>.
+            </summary>
+        </member>
+        <member name="M:NSubstitute.Raise.EventWith``1(``0)">
+            <summary>
+            Raise an event for an <c>EventHandler<TEventArgs></c> event with the substitute as the sender and the provided <paramref name="eventArgs" />.
+            </summary>
+        </member>
+        <member name="M:NSubstitute.Raise.EventWith``1">
+            <summary>
+            Raise an event for an <c>EventHandler<EventArgsT></c> event with the substitute as the sender
+            and with a default instance of <typeparamref name="TEventArgs" />.
+            </summary>
+        </member>
+        <member name="M:NSubstitute.Raise.Event">
+            <summary>
+            Raise an event for an <c>EventHandler</c> or <c>EventHandler<EventArgs></c> event with the substitute
+            as the sender and with empty <c>EventArgs</c>.
+            </summary>
+        </member>
+        <member name="M:NSubstitute.Raise.Event``1(System.Object[])">
+            <summary>
+            Raise an event of type <typeparamref name="THandler" /> with the provided arguments. If no arguments are provided
+            NSubstitute will try and provide reasonble defaults.
+            </summary>
+        </member>
+        <member name="T:NSubstitute.Substitute">
+            <summary>
+            Create a substitute for one or more types. For example: <c>Substitute.For<ISomeType>()</c> 
+            </summary>
+        </member>
+        <member name="M:NSubstitute.Substitute.For``1(System.Object[])">
+            <summary>
+            Substitute for an interface or class.
+            <para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members 
+            can be recorded or have return values specified.</para>
+            </summary>
+            <typeparam name="T">The type of interface or class to substitute.</typeparam>
+            <param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
+            <returns>A substitute for the interface or class.</returns>
+        </member>
+        <member name="M:NSubstitute.Substitute.For``2(System.Object[])">
+            <summary>
+            <para>Substitute for multiple interfaces or a class that implements an interface. At most one class can be specified.</para>
+            <para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members 
+            can be recorded or have return values specified.</para>
+            </summary>
+            <typeparam name="T1">The type of interface or class to substitute.</typeparam>
+            <typeparam name="T2">An additional interface or class (maximum of one class) the substitute should implement.</typeparam>
+            <param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
+            <returns>A substitute of type T1, that also implements T2.</returns>
+        </member>
+        <member name="M:NSubstitute.Substitute.For``3(System.Object[])">
+            <summary>
+            <para>Substitute for multiple interfaces or a class that implements multiple interfaces. At most one class can be specified.</para>
+            If additional interfaces are required use the <see cref="M:NSubstitute.Substitute.For(System.Type[],System.Object[])"/> overload.
+            <para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members 
+            can be recorded or have return values specified.</para>
+            </summary>
+            <typeparam name="T1">The type of interface or class to substitute.</typeparam>
+            <typeparam name="T2">An additional interface or class (maximum of one class) the substitute should implement.</typeparam>
+            <typeparam name="T3">An additional interface or class (maximum of one class) the substitute should implement.</typeparam>
+            <param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
+            <returns>A substitute of type T1, that also implements T2 and T3.</returns>
+        </member>
+        <member name="M:NSubstitute.Substitute.For(System.Type[],System.Object[])">
+            <summary>
+            <para>Substitute for multiple interfaces or a class that implements multiple interfaces. At most one class can be specified.</para>
+            <para>Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members 
+            can be recorded or have return values specified.</para>
+            </summary>
+            <param name="typesToProxy">The types of interfaces or a type of class and multiple interfaces the substitute should implement.</param>
+            <param name="constructorArguments">Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors.</param>
+            <returns>A substitute implementing the specified types.</returns>
+        </member>
+    </members>
+</doc>
diff --git a/lib/Rhino.Mocks.xml b/lib/Rhino.Mocks.xml
new file mode 100644
index 0000000..5d9370d
--- /dev/null
+++ b/lib/Rhino.Mocks.xml
@@ -0,0 +1,5413 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Rhino.Mocks</name>
+    </assembly>
+    <members>
+        <member name="T:Rhino.Mocks.Arg`1">
+            <summary>
+            Defines constraints and return values for arguments of a mock.
+            Only use Arg inside a method call on a mock that is recording.
+            Example: 
+              ExpectCall( 
+                mock.foo(
+                  Arg<int>.Is.GreaterThan(2),
+                  Arg<string>.Is.Anything
+                ));
+            Use Arg.Text for string specific constraints
+            Use Arg<ListClass>.List for list specific constraints
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="M:Rhino.Mocks.Arg`1.Matches(System.Linq.Expressions.Expression{System.Predicate{`0}})">
+            <summary>
+            Register the predicate as a constraint for the current call.
+            </summary>
+            <param name="predicate">The predicate.</param>
+            <returns>default(T)</returns>
+            <example>
+            Allow you to use code to create constraints
+            <code>
+            demo.AssertWasCalled(x => x.Bar(Arg{string}.Matches(a => a.StartsWith("b") && a.Contains("ba"))));
+            </code>
+            </example>
+        </member>
+        <member name="M:Rhino.Mocks.Arg`1.Matches(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Define a complex constraint for this argument by passing several constraints
+            combined with operators. (Use Is in simple cases.)
+            Example: Arg<string>.Matches(Is.Equal("Hello") || Text.EndsWith("u"));
+            </summary>
+            <param name="constraint">Constraints using Is, Text and List</param>
+            <returns>Dummy to satisfy the compiler</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Arg`1.Ref(Rhino.Mocks.Constraints.AbstractConstraint,`0)">
+            <summary>
+            Define a Ref argument.
+            </summary>
+            <param name="constraint">Constraints for this argument</param>
+            <param name="returnValue">value returned by the mock</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Arg`1.Out(`0)">
+            <summary>
+            Define a out parameter. Use it together with the keyword out and use the
+            Dummy field available by the return value.
+            Example:  mock.foo( out Arg<string>.Out("hello").Dummy );
+            </summary>
+            <param name="returnValue"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Arg`1.Is">
+            <summary>
+            Define a simple constraint for this argument. (Use Matches in simple cases.)
+            Example: 
+              Arg<int>.Is.Anthing
+              Arg<string>.Is.Equal("hello")
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Arg`1.List">
+            <summary>
+            Define Constraints on list arguments.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Arg">
+            <summary>
+            Use the Arg class (without generic) to define Text constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Arg.Is``1(``0)">
+            <summary>
+            Evaluate an equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="arg">The object the parameter should equal to</param>
+        </member>
+        <member name="P:Rhino.Mocks.Arg.Text">
+            <summary>
+            Define constraints on text arguments.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.ArgManager">
+            <summary>
+            Used to manage the static state of the Arg<T> class"/>
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.ArgManager.Clear">
+            <summary>
+            Resets the static state
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.ArgManager.GetAllReturnValues">
+            <summary>
+            Returns return values for the out and ref parameters
+            Note: the array returned has the size of the number of out and ref 
+            argument definitions
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.ArgManager.GetAllConstraints">
+            <summary>
+            Returns the constraints for all arguments.
+            Out arguments have an Is.Anything constraint and are also in the list.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Rhino.Mocks.BackToRecordOptions">
+            <summary>
+            What should BackToRecord clear
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.BackToRecordOptions.None">
+            <summary>
+            Retain all expectations and behaviors and return to mock
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.BackToRecordOptions.Expectations">
+            <summary>
+            All expectations
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.BackToRecordOptions.EventSubscribers">
+            <summary>
+            Event subscribers for this instance
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.BackToRecordOptions.OriginalMethodsToCall">
+            <summary>
+            Methods that should be forwarded to the base class implementation
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.BackToRecordOptions.PropertyBehavior">
+            <summary>
+            Properties that should behave like properties
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.BackToRecordOptions.All">
+            <summary>
+            Remove all the behavior of the object
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.AbstractConstraint">
+            <summary>
+            Interface for constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AbstractConstraint.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AbstractConstraint.op_BitwiseAnd(Rhino.Mocks.Constraints.AbstractConstraint,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            And operator for constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AbstractConstraint.op_LogicalNot(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Not operator for constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AbstractConstraint.op_BitwiseOr(Rhino.Mocks.Constraints.AbstractConstraint,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Or operator for constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AbstractConstraint.op_False(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Allow overriding of || or &&
+            </summary>
+            <param name="c"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AbstractConstraint.op_True(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Allow overriding of || or &&
+            </summary>
+            <param name="c"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.AbstractConstraint.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.PublicFieldIs">
+            <summary>
+            Constrain that the public field has a specified value
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.PublicFieldConstraint">
+            <summary>
+            Constrain that the public field matches another constraint.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicFieldConstraint.#ctor(System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PublicFieldConstraint"/> instance.
+            </summary>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="constraint">Constraint to place on the public field value.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicFieldConstraint.#ctor(System.Type,System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PublicFieldConstraint"/> instance, specifying a disambiguating
+            <paramref name="declaringType"/> for the public field.
+            </summary>
+            <param name="declaringType">The type that declares the public field, used to disambiguate between public fields.</param>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="constraint">Constraint to place on the public field value.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicFieldConstraint.Eval(System.Object)">
+            <summary>
+            Determines if the object passes the constraint.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.PublicFieldConstraint.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicFieldIs.#ctor(System.String,System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PublicFieldIs"/> instance.
+            </summary>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="expectedValue">Expected value.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicFieldIs.#ctor(System.Type,System.String,System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PublicFieldIs"/> instance, specifying a disambiguating
+            <paramref name="declaringType"/> for the public field.
+            </summary>
+            <param name="declaringType">The type that declares the public field, used to disambiguate between public fields.</param>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="expectedValue">Expected value.</param>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.PropertyIs">
+            <summary>
+            Constrain that the property has a specified value
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.PropertyConstraint">
+            <summary>
+            Constrain that the property matches another constraint.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PropertyConstraint.#ctor(System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PropertyConstraint"/> instance.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="constraint">Constraint to place on the property value.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PropertyConstraint.#ctor(System.Type,System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PropertyConstraint"/> instance, specifying a disambiguating
+            <paramref name="declaringType"/> for the property.
+            </summary>
+            <param name="declaringType">The type that declares the property, used to disambiguate between properties.</param>
+            <param name="propertyName">Name of the property.</param>
+            <param name="constraint">Constraint to place on the property value.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PropertyConstraint.Eval(System.Object)">
+            <summary>
+            Determines if the object passes the constraint.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.PropertyConstraint.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PropertyIs.#ctor(System.String,System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PropertyIs"/> instance.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="expectedValue">Expected value.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PropertyIs.#ctor(System.Type,System.String,System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.PropertyIs"/> instance, specifying a disambiguating
+            <paramref name="declaringType"/> for the property.
+            </summary>
+            <param name="declaringType">The type that declares the property, used to disambiguate between properties.</param>
+            <param name="propertyName">Name of the property.</param>
+            <param name="expectedValue">Expected value.</param>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.TypeOf">
+            <summary>
+            Constrain that the parameter must be of the specified type
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TypeOf.#ctor(System.Type)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.TypeOf"/> instance.
+            </summary>
+            <param name="type">Type.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TypeOf.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.TypeOf.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Same">
+            <summary>
+            Constraint that determines whether an object is the same object as another.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Same.#ctor(System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.Equal"/> instance.
+            </summary>
+            <param name="obj">Obj.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Same.Eval(System.Object)">
+            <summary>
+            Determines if the object passes the constraints.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Same.Message">
+            <summary>
+            Gets the message for this constraint.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.PredicateConstraint`1">
+            <summary>
+            Evaluate a parameter using constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PredicateConstraint`1.#ctor(System.Predicate{`0})">
+            <summary>
+            Create new instance 
+            </summary>
+            <param name="predicate"></param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PredicateConstraint`1.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.PredicateConstraint`1.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.LambdaConstraint">
+            <summary>
+            A constraint based on lambda expression, we are using Expression{T} 
+            because we want to be able to get good error reporting on that.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.LambdaConstraint.#ctor(System.Linq.Expressions.LambdaExpression)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Constraints.LambdaConstraint"/> class.
+            </summary>
+            <param name="expr">The expr.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.LambdaConstraint.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.LambdaConstraint.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.CollectionEqual">
+            <summary>
+            Constrain that the list contains the same items as the parameter list
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.CollectionEqual.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.CollectionEqual"/> instance.
+            </summary>
+            <param name="collection">In list.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.CollectionEqual.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.CollectionEqual.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.OneOf">
+            <summary>
+            Constrain that the parameter is one of the items in the list
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.OneOf.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.OneOf"/> instance.
+            </summary>
+            <param name="collection">In list.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.OneOf.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.OneOf.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.IsIn">
+            <summary>
+            Constrain that the object is inside the parameter list
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsIn.#ctor(System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.IsIn"/> instance.
+            </summary>
+            <param name="inList">In list.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsIn.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.IsIn.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.CollectionCount">
+            <summary>
+            Applies another AbstractConstraint to the collection count.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.CollectionCount.#ctor(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.CollectionCount"/> instance.
+            </summary>
+            <param name="constraint">The constraint that should be applied to the collection count.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.CollectionCount.Eval(System.Object)">
+            <summary>
+            Determines if the parameter conforms to this constraint.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.CollectionCount.Message">
+            <summary>
+            Gets the message for this constraint.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.ListElement">
+            <summary>
+            Applies another AbstractConstraint to a specific list element.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListElement.#ctor(System.Int32,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.ListElement"/> instance.
+            </summary>
+            <param name="index">The zero-based index of the list element.</param>
+            <param name="constraint">The constraint that should be applied to the list element.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListElement.Eval(System.Object)">
+            <summary>
+            Determines if the parameter conforms to this constraint.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.ListElement.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.KeyedListElement`1">
+            <summary>
+            Applies another AbstractConstraint to a specific generic keyed list element.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.KeyedListElement`1.#ctor(`0,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:KeyedListElement"/> instance.
+            </summary>
+            <param name="key">The key of the list element.</param>
+            <param name="constraint">The constraint that should be applied to the list element.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.KeyedListElement`1.Eval(System.Object)">
+            <summary>
+            Determines if the parameter conforms to this constraint.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.KeyedListElement`1.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.ContainsAll">
+            <summary>
+            Constrains that all elements are in the parameter list
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ContainsAll.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Constraints.ContainsAll"/> class.
+            </summary>
+            <param name="these">The these.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ContainsAll.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.ContainsAll.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Or">
+            <summary>
+            Combines two constraints, constraint pass if either is fine.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Or.#ctor(Rhino.Mocks.Constraints.AbstractConstraint,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.And"/> instance.
+            </summary>
+            <param name="c1">C1.</param>
+            <param name="c2">C2.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Or.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Or.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Not">
+            <summary>
+            Negate a constraint
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Not.#ctor(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.And"/> instance.
+            </summary>
+            <param name="c1">C1.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Not.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Not.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.And">
+            <summary>
+            Combines two constraints
+            </summary>
+            <remarks></remarks>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.And.#ctor(Rhino.Mocks.Constraints.AbstractConstraint,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.And"/> instance.
+            </summary>
+            <param name="c1">C1.</param>
+            <param name="c2">C2.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.And.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.And.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Like">
+            <summary>
+            Constrain the argument to validate according to regex pattern
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Like.#ctor(System.String)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.Like"/> instance.
+            </summary>
+            <param name="pattern">Pattern.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Like.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Like.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Contains">
+            <summary>
+            Constraint that evaluate whatever an argument contains the specified string.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Contains.#ctor(System.String)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.Contains"/> instance.
+            </summary>
+            <param name="innerString">Inner string.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Contains.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Contains.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.EndsWith">
+            <summary>
+            Constraint that evaluate whatever an argument ends with the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.EndsWith.#ctor(System.String)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.EndsWith"/> instance.
+            </summary>
+            <param name="end">End.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.EndsWith.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.EndsWith.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.StartsWith">
+            <summary>
+            Constraint that evaluate whatever an argument start with the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.StartsWith.#ctor(System.String)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.StartsWith"/> instance.
+            </summary>
+            <param name="start">Start.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.StartsWith.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.StartsWith.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Equal">
+            <summary>
+            Constraint that evaluate whatever an object equals another
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Equal.#ctor(System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.Equal"/> instance.
+            </summary>
+            <param name="obj">Obj.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Equal.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Equal.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Anything">
+            <summary>
+            Constraint that always returns true
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Anything.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.Anything.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.ComparingConstraint">
+            <summary>
+            Constraint that evaluate whatever a comparable is greater than another
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ComparingConstraint.#ctor(System.IComparable,System.Boolean,System.Boolean)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Constraints.ComparingConstraint"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ComparingConstraint.Eval(System.Object)">
+            <summary>
+            Determines if the object pass the constraints
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.ComparingConstraint.Message">
+            <summary>
+            Gets the message for this constraint
+            </summary>
+            <value></value>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new constraint object.
+            </summary>
+            <param name="expected">The expected object, The actual object is passed in as a parameter to the <see cref="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.Eval(System.Object)"/> method</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.Eval(System.Object)">
+            <summary>
+            Evaluate this constraint.
+            </summary>
+            <param name="obj">The actual object that was passed in the method call to the mock.</param>
+            <returns>True when the constraint is met, else false.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.CheckReferenceType(System.Object,System.Object)">
+            <summary>
+            Checks if the properties of the <paramref name="actual"/> object
+            are the same as the properies of the <paramref name="expected"/> object.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <returns>True when both objects have the same values, else False.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.CheckValue(System.Object,System.Object)">
+            <summary>
+            
+            </summary>
+            <param name="expected"></param>
+            <param name="actual"></param>
+            <returns></returns>
+            <remarks>This is the real heart of the beast.</remarks>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.CheckProperties(System.Object,System.Object)">
+            <summary>
+            Used by CheckReferenceType to check all properties of the reference type.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <returns>True when both objects have the same values, else False.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.CheckFields(System.Object,System.Object)">
+            <summary>
+            Used by CheckReferenceType to check all fields of the reference type.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <returns>True when both objects have the same values, else False.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.CheckCollection(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Checks the items of both collections
+            </summary>
+            <param name="expectedCollection">The expected collection</param>
+            <param name="actualCollection"></param>
+            <returns>True if both collections contain the same items in the same order.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.BuildPropertyName">
+            <summary>
+            Builds a propertyname from the Stack _properties like 'Order.Product.Price'
+            to be used in the error message.
+            </summary>
+            <returns>A nested property name.</returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.AllPropertiesMatchConstraint.Message">
+            <summary>
+            Rhino.Mocks uses this property to generate an error message.
+            </summary>
+            <value>
+            A message telling the tester why the constraint failed.
+            </value>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.IsArg`1">
+            <summary>
+            Provides access to the constraintes defined in the class <see cref="T:Rhino.Mocks.Constraints.Is"/> to be used in context
+            with the <see cref="T:Rhino.Mocks.Arg`1"/> syntax.
+            </summary>
+            <typeparam name="T">The type of the argument</typeparam>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.GreaterThan(System.IComparable)">
+            <summary>
+            Evaluate a greater than constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be greater than</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.LessThan(System.IComparable)">
+            <summary>
+            Evaluate a less than constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be less than</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.LessThanOrEqual(System.IComparable)">
+            <summary>
+            Evaluate a less than or equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be less than or equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.GreaterThanOrEqual(System.IComparable)">
+            <summary>
+            Evaluate a greater than or equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be greater than or equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.Equal(System.Object)">
+            <summary>
+            Evaluate an equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="obj">The object the parameter should equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.NotEqual(System.Object)">
+            <summary>
+            Evaluate a not equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="obj">The object the parameter should not equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.Same(System.Object)">
+            <summary>
+            Evaluate a same as constraint.
+            </summary>
+            <param name="obj">The object the parameter should the same as.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.NotSame(System.Object)">
+            <summary>
+            Evaluate a not same as constraint.
+            </summary>
+            <param name="obj">The object the parameter should not be the same as.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.Equals(System.Object)">
+            <summary>
+            Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead.
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.IsArg`1.GetHashCode">
+            <summary>
+            Serves as a hash function for a particular type.
+            </summary>
+            <returns>
+            A hash code for the current <see cref="T:System.Object"/>.
+            </returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.IsArg`1.Anything">
+            <summary>
+            A constraints that accept anything
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.IsArg`1.Null">
+            <summary>
+            A constraint that accept only nulls
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.IsArg`1.NotNull">
+            <summary>
+            A constraint that accept only non null values
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Constraints.IsArg`1.TypeOf">
+            <summary>
+            A constraint that accept only value of the specified type.
+            The check is performed on the type that has been defined
+            as the argument type.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.ListArg`1">
+            <summary>
+            Provides access to the constraints defined in the class <see cref="T:Rhino.Mocks.Constraints.Text"/> to be used in context
+            with the <see cref="T:Rhino.Mocks.Arg`1"/> syntax.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.IsIn(System.Object)">
+            <summary>
+            Determines whether the specified object is in the parameter.
+            The parameter must be IEnumerable.
+            </summary>
+            <param name="obj">Obj.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.OneOf(System.Collections.IEnumerable)">
+            <summary>
+            Determines whatever the parameter is in the collection.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.Equal(System.Collections.IEnumerable)">
+            <summary>
+            Determines that the parameter collection is identical to the specified collection
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.Count(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Determines that the parameter collection has the specified number of elements.
+            </summary>
+            <param name="constraint">The constraint that should be applied to the collection count.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.Element(System.Int32,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Determines that an element of the parameter collections conforms to another AbstractConstraint.
+            </summary>
+            <param name="index">The zero-based index of the list element.</param>
+            <param name="constraint">The constraint which should be applied to the list element.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.ContainsAll(System.Collections.IEnumerable)">
+            <summary>
+             Determines that all elements of the specified collection are in the the parameter collection 
+            </summary>
+            <param name="collection">The collection to compare against</param>
+            <returns>The constraint which should be applied to the list parameter.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.Equals(System.Object)">
+            <summary>
+            Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead.
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.ListArg`1.GetHashCode">
+            <summary>
+            Serves as a hash function for a particular type.
+            </summary>
+            <returns>
+            A hash code for the current <see cref="T:System.Object"/>.
+            </returns>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.OutRefArgDummy`1">
+            <summary>
+            Provides a dummy field to pass as out or ref argument.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="F:Rhino.Mocks.Constraints.OutRefArgDummy`1.Dummy">
+            <summary>
+            Dummy field to satisfy the compiler. Used for out and ref arguments.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.PublicField">
+            <summary>
+            Central location for constraints for object's public fields
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.Value(System.String,System.Object)">
+            <summary>
+            Constrains the parameter to have a public field with the specified value
+            </summary>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="expectedValue">Expected value.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.Value(System.Type,System.String,System.Object)">
+            <summary>
+            Constrains the parameter to have a public field with the specified value.
+            </summary>
+            <param name="declaringType">The type that declares the public field, used to disambiguate between public fields.</param>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="expectedValue">Expected value.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.ValueConstraint(System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Constrains the parameter to have a public field satisfying a specified constraint.
+            </summary>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="publicFieldConstraint">Constraint for the public field.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.ValueConstraint(System.Type,System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Constrains the parameter to have a public field satisfying a specified constraint.
+            </summary>
+            <param name="declaringType">The type that declares the public field, used to disambiguate between public fields.</param>
+            <param name="publicFieldName">Name of the public field.</param>
+            <param name="publicFieldConstraint">Constraint for the public field.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.IsNull(System.String)">
+            <summary>
+            Determines whether the parameter has the specified public field and that it is null.
+            </summary>
+            <param name="publicFieldName">Name of the public field.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.IsNull(System.Type,System.String)">
+            <summary>
+            Determines whether the parameter has the specified public field and that it is null.
+            </summary>
+            <param name="declaringType">The type that declares the public field, used to disambiguate between public fields.</param>
+            <param name="publicFieldName">Name of the public field.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.IsNotNull(System.String)">
+            <summary>
+            Determines whether the parameter has the specified public field and that it is not null.
+            </summary>
+            <param name="publicFieldName">Name of the public field.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.PublicField.IsNotNull(System.Type,System.String)">
+            <summary>
+            Determines whether the parameter has the specified public field and that it is not null.
+            </summary>
+            <param name="declaringType">The type that declares the public field, used to disambiguate between public fields.</param>
+            <param name="publicFieldName">Name of the public field.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Is">
+            <summary>
+            Central location for constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.GreaterThan(System.IComparable)">
+            <summary>
+            Evaluate a greater than constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be greater than</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.LessThan(System.IComparable)">
+            <summary>
+            Evaluate a less than constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be less than</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.LessThanOrEqual(System.IComparable)">
+            <summary>
+            Evaluate a less than or equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be less than or equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.GreaterThanOrEqual(System.IComparable)">
+            <summary>
+            Evaluate a greater than or equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="objToCompare">The object the parameter should be greater than or equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.Equal(System.Object)">
+            <summary>
+            Evaluate an equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="obj">The object the parameter should equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.NotEqual(System.Object)">
+            <summary>
+            Evaluate a not equal constraint for <see cref="T:System.IComparable"/>.
+            </summary>
+            <param name="obj">The object the parameter should not equal to</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.Same(System.Object)">
+            <summary>
+            Evaluate a same as constraint.
+            </summary>
+            <param name="obj">The object the parameter should the same as.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.NotSame(System.Object)">
+            <summary>
+            Evaluate a not same as constraint.
+            </summary>
+            <param name="obj">The object the parameter should not be the same as.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.Anything">
+            <summary>
+            A constraints that accept anything
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.Null">
+            <summary>
+            A constraint that accept only nulls
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.NotNull">
+            <summary>
+            A constraint that accept only non null values
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.TypeOf(System.Type)">
+            <summary>
+            A constraint that accept only value of the specified type
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.TypeOf``1">
+            <summary>
+            A constraint that accept only value of the specified type
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Is.Matching``1(System.Predicate{``0})">
+            <summary>
+            Evaluate a parameter using a predicate
+            </summary>
+            <param name="predicate">The predicate to use</param>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.List">
+            <summary>
+            Central location for constraints about lists and collections
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.IsIn(System.Object)">
+            <summary>
+            Determines whether the specified obj is in the parameter.
+            The parameter must be IEnumerable.
+            </summary>
+            <param name="obj">Obj.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.OneOf(System.Collections.IEnumerable)">
+            <summary>
+            Determines whatever the parameter is in the collection.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.Equal(System.Collections.IEnumerable)">
+            <summary>
+            Determines that the parameter collection is identical to the specified collection
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.Count(Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Determines that the parameter collection has the specified number of elements.
+            </summary>
+            <param name="constraint">The constraint that should be applied to the collection count.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.Element(System.Int32,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Determines that an element of the parameter collections conforms to another AbstractConstraint.
+            </summary>
+            <param name="index">The zero-based index of the list element.</param>
+            <param name="constraint">The constraint which should be applied to the list element.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.Element``1(``0,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Determines that an element of the parameter collections conforms to another AbstractConstraint.
+            </summary>
+            <param name="key">The key of the element.</param>
+            <param name="constraint">The constraint which should be applied to the element.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.List.ContainsAll(System.Collections.IEnumerable)">
+            <summary>
+             Determines that all elements of the specified collection are in the the parameter collection 
+            </summary>
+            <param name="collection">The collection to compare against</param>
+            <returns>The constraint which should be applied to the list parameter.</returns>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Property">
+            <summary>
+            Central location for constraints for object's properties
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.Value(System.String,System.Object)">
+            <summary>
+            Constrains the parameter to have property with the specified value
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="expectedValue">Expected value.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.Value(System.Type,System.String,System.Object)">
+            <summary>
+            Constrains the parameter to have property with the specified value.
+            </summary>
+            <param name="declaringType">The type that declares the property, used to disambiguate between properties.</param>
+            <param name="propertyName">Name of the property.</param>
+            <param name="expectedValue">Expected value.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.ValueConstraint(System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Constrains the parameter to have a property satisfying a specified constraint.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="propertyConstraint">Constraint for the property.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.ValueConstraint(System.Type,System.String,Rhino.Mocks.Constraints.AbstractConstraint)">
+            <summary>
+            Constrains the parameter to have a property satisfying a specified constraint.
+            </summary>
+            <param name="declaringType">The type that declares the property, used to disambiguate between properties.</param>
+            <param name="propertyName">Name of the property.</param>
+            <param name="propertyConstraint">Constraint for the property.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.IsNull(System.String)">
+            <summary>
+            Determines whether the parameter has the specified property and that it is null.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.IsNull(System.Type,System.String)">
+            <summary>
+            Determines whether the parameter has the specified property and that it is null.
+            </summary>
+            <param name="declaringType">The type that declares the property, used to disambiguate between properties.</param>
+            <param name="propertyName">Name of the property.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.IsNotNull(System.String)">
+            <summary>
+            Determines whether the parameter has the specified property and that it is not null.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.IsNotNull(System.Type,System.String)">
+            <summary>
+            Determines whether the parameter has the specified property and that it is not null.
+            </summary>
+            <param name="declaringType">The type that declares the property, used to disambiguate between properties.</param>
+            <param name="propertyName">Name of the property.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Property.AllPropertiesMatch(System.Object)">
+            <summary>
+            constraints the parameter to have the exact same property values as the expected object.
+            </summary>
+            <param name="expected">An object, of the same type as the parameter, whose properties are set with the expected values.</param>
+            <returns>An instance of the constraint that will do the actual check.</returns>
+            <remarks>
+            The parameter's public property values and public field values will be matched against the expected object's
+            public property values and public field values. The first mismatch will be reported and no further matching is done.
+            The matching is recursive for any property or field that has properties or fields of it's own.
+            Collections are supported through IEnumerable, which means the constraint will check if the actual and expected
+            collection contain the same values in the same order, where the values contained by the collection can have properties
+            and fields of their own that will be checked as well because of the recursive nature of this constraint.
+            </remarks>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.Text">
+            <summary>
+            Central location for all text related constraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Text.StartsWith(System.String)">
+            <summary>
+            Constrain the argument to starts with the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Text.EndsWith(System.String)">
+            <summary>
+            Constrain the argument to end with the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Text.Contains(System.String)">
+            <summary>
+            Constrain the argument to contain the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.Text.Like(System.String)">
+            <summary>
+            Constrain the argument to validate according to regex pattern
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Constraints.TextArg">
+            <summary>
+            Provides access to the constraintes defined in the class <see cref="T:Rhino.Mocks.Constraints.Text"/> to be used in context
+            with the <see cref="T:Rhino.Mocks.Arg"/> syntax.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TextArg.StartsWith(System.String)">
+            <summary>
+            Constrain the argument to starts with the specified string
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TextArg.EndsWith(System.String)">
+            <summary>
+            Constrain the argument to end with the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TextArg.Contains(System.String)">
+            <summary>
+            Constrain the argument to contain the specified string
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TextArg.Like(System.String)">
+            <summary>
+            Constrain the argument to validate according to regex pattern
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TextArg.Equals(System.Object)">
+            <summary>
+            Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead.
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Constraints.TextArg.GetHashCode">
+            <summary>
+            Serves as a hash function for a particular type.
+            </summary>
+            <returns>
+            A hash code for the current <see cref="T:System.Object"/>.
+            </returns>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates">
+            <summary>
+            This class defines a lot of method signatures, which we will use
+            to allow compatability on net-2.0
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`1">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`2">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`2">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`3">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`3">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`4">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`4">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`5">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`5">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`6">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`6">
+            <summary>
+            dummy
+            </summary>
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`7">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`7">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`8">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`8">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`9">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`9">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`10">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Action`10">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Delegates.Function`11">
+            <summary>
+            dummy
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.DoNotExpect">
+            <summary>
+            Allows expectations to be set on methods that should never be called.
+            For methods with void return value, you need to use LastCall or
+            DoNotExpect.Call() with a delegate.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.DoNotExpect.Call(System.Object)">
+            <summary>
+            Sets LastCall.Repeat.Never() on /any/ proxy on /any/ repository on the current thread.
+            This method if not safe for multi threading scenarios.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.DoNotExpect.Call(Rhino.Mocks.Expect.Action)">
+            <summary>
+            Accepts a delegate that will execute inside the method which
+            LastCall.Repeat.Never() will be applied to.
+            It is expected to be used with anonymous delegates / lambda expressions and only one
+            method should be called.
+            </summary>
+            <example>
+            IService mockSrv = mocks.CreateMock(typeof(IService)) as IService;
+            DoNotExpect.Call(delegate{ mockSrv.Stop(); });
+            ...
+            </example>
+        </member>
+        <member name="T:Rhino.Mocks.Exceptions.ExpectationViolationException">
+            <summary>
+            An expectaton violation was detected.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Exceptions.ExpectationViolationException.#ctor(System.String)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Exceptions.ExpectationViolationException"/> instance.
+            </summary>
+            <param name="message">Message.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Exceptions.ExpectationViolationException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization constructor
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Exceptions.ObjectNotMockFromThisRepositoryException">
+            <summary>
+            Signals that an object was call on a mock repository which doesn't
+            belong to this mock repository or not a mock
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Exceptions.ObjectNotMockFromThisRepositoryException.#ctor(System.String)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Exceptions.ObjectNotMockFromThisRepositoryException"/> instance.
+            </summary>
+            <param name="message">Message.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Exceptions.ObjectNotMockFromThisRepositoryException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization constructor
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Expect">
+            <summary>
+            Allows to set expectation on methods that has return values.
+            For methods with void return value, you need to use LastCall
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expect.Call``1(``0)">
+            <summary>
+            The method options for the last call on /any/ proxy on /any/ repository on the current thread.
+            This method if not safe for multi threading scenarios, use <see cref="M:Rhino.Mocks.Expect.On(System.Object)"/>.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expect.Call(Rhino.Mocks.Expect.Action)">
+            <summary>
+            Accepts a delegate that will execute inside the method, and then return the resulting
+            <see cref="T:Rhino.Mocks.Interfaces.IMethodOptions`1"/> instance.
+            It is expected to be used with anonymous delegates / lambda expressions and only one
+            method should be called.
+            </summary>
+            <example>
+            IService mockSrv = mocks.CreateMock(typeof(IService)) as IService;
+            Expect.Call(delegate{ mockSrv.Start(); }).Throw(new NetworkException());
+            ...
+            </example>
+        </member>
+        <member name="M:Rhino.Mocks.Expect.On(System.Object)">
+            <summary>
+            Get the method options for the last method call on the mockInstance.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Expect.Action">
+            <summary>
+            A delegate that can be used to get better syntax on Expect.Call(delegate { foo.DoSomething(); });
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Expectations.AbstractExpectation">
+            <summary>
+            Abstract class that holds common information for 
+            expectations.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IExpectation">
+            <summary>
+            Interface to validate that a method call is correct.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectation.IsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method.
+            This method can be called numerous times, so be careful about side effects
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectation.AddActualCall">
+            <summary>
+            Add an actual method call to this expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectation.ReturnOrThrow(Castle.Core.Interceptor.IInvocation,System.Object[])">
+            <summary>
+            Returns the return value or throw the exception and setup any output / ref parameters
+            that has been set.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectation.BuildVerificationFailureMessage">
+            <summary>
+            Builds the verification failure message.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ErrorMessage">
+            <summary>
+            Gets the error message.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.Expected">
+            <summary>
+            Range of expected calls
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ActualCallsCount">
+            <summary>
+            Number of call actually made for this method
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.CanAcceptCalls">
+            <summary>
+            If this expectation is still waiting for calls.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ReturnValue">
+            <summary>
+            The return value for a method matching this expectation
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ExceptionToThrow">
+            <summary>
+            Gets or sets the exception to throw on a method matching this expectation.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ActionsSatisfied">
+            <summary>
+            Gets a value indicating whether this instance's action is staisfied.
+            A staisfied instance means that there are no more requirements from
+            this method. A method with non void return value must register either
+            a return value or an exception to throw.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.Method">
+            <summary>
+            Gets the method this expectation is for.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.RepeatableOption">
+            <summary>
+            Gets or sets what special condtions there are for this method
+            repeating.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ExpectationSatisfied">
+            <summary>
+            Gets a value indicating whether this expectation was satisfied
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.HasReturnValue">
+            <summary>
+            Specify whatever this expectation has a return value set
+            You can't check ReturnValue for this because a valid return value include null.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.ActionToExecute">
+            <summary>
+            An action to execute when the method is matched.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.OutRefParams">
+            <summary>
+            Set the out / ref parameters for the method call.
+            The indexing is zero based and ignores any non out/ref parameter.
+            It is possible not to pass all the parameters. This method can be called only once.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.Message">
+            <summary>
+            Documentation Message
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.Originalinvocation">
+            <summary>
+            Gets the invocation for this expectation
+            </summary>
+            <value>The invocation.</value>
+        </member>
+        <member name="E:Rhino.Mocks.Interfaces.IExpectation.WhenCalled">
+            <summary>
+            Occurs when the exceptation is match on a method call
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IExpectation.AllowTentativeReturn">
+            <summary>
+            Allow to set the return value in the future, if it was already set.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.actualCallsCount">
+            <summary>
+            Number of actuall calls made that passed this expectation
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.expected">
+            <summary>
+            Range of expected calls that should pass this expectation.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.returnValue">
+            <summary>
+            The return value for a method matching this expectation
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.exceptionToThrow">
+            <summary>
+            The exception to throw on a method matching this expectation.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.method">
+            <summary>
+            The method this expectation is for.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.returnValueSet">
+            <summary>
+            The return value for this method was set
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.repeatableOption">
+            <summary>
+            Whether this method will repeat
+            unlimited number of times.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.actionToExecute">
+            <summary>
+            A delegate that will be run when the 
+            expectation is matched.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.matchingArgs">
+            <summary>
+            The arguments that matched this expectation.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.message">
+            <summary>
+            Documentation message
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Expectations.AbstractExpectation.originalInvocation">
+            <summary>
+            The method originalInvocation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.GetHashCode">
+            <summary>
+            Get the hash code
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.AddActualCall">
+            <summary>
+            Add an actual actualMethodCall call to this expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.BuildVerificationFailureMessage">
+            <summary>
+            Builds the verification failure message.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.ReturnOrThrow(Castle.Core.Interceptor.IInvocation,System.Object[])">
+            <summary>
+            Returns the return value or throw the exception and setup output / ref parameters
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.IsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method on the child methods
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.#ctor(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Impl.Range)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.AbstractExpectation"/> instance.
+            </summary>
+            <param name="invocation">The originalInvocation for this method, required because it contains the generic type infromation</param>
+            <param name="expectedRange">Number of method calls for this expectations</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.#ctor(Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.AbstractExpectation"/> instance.
+            </summary>
+            <param name="expectation">Expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.DoIsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method on the child methods
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.Equals(System.Object)">
+            <summary>
+            Determines if this object equal to obj
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.CreateErrorMessage(System.String)">
+            <summary>
+            The error message for these arguments
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AbstractExpectation.AssertDelegateArgumentsMatchMethod(System.Delegate)">
+            <summary>
+            Asserts that the delegate has the same parameters as the expectation's method call
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.OutRefParams">
+            <summary>
+            Setter for the outpur / ref parameters for this expecataion.
+            Can only be set once.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.HasReturnValue">
+            <summary>
+            Specify whether this expectation has a return value set
+            You can't check ReturnValue for this because a valid return value include null.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.Method">
+            <summary>
+            Gets the method this expectation is for.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.Originalinvocation">
+            <summary>
+            Gets the originalInvocation for this expectation
+            </summary>
+            <value>The originalInvocation.</value>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.RepeatableOption">
+            <summary>
+            Gets or sets what special condtions there are for this method
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.Expected">
+            <summary>
+            Range of expected calls
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ActualCallsCount">
+            <summary>
+            Number of call actually made for this method
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.CanAcceptCalls">
+            <summary>
+            If this expectation is still waiting for calls.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ExpectationSatisfied">
+            <summary>
+            Gets a value indicating whether this expectation was satisfied
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ReturnValue">
+            <summary>
+            The return value for a method matching this expectation
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ActionToExecute">
+            <summary>
+            An action to execute when the method is matched.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ExceptionToThrow">
+            <summary>
+            Gets or sets the exception to throw on a method matching this expectation.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ActionsSatisfied">
+            <summary>
+            Gets a value indicating whether this instance's action is staisfied.
+            A staisfied instance means that there are no more requirements from
+            this method. A method with non void return value must register either
+            a return value or an exception to throw or an action to execute.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.Message">
+            <summary>
+            Documentation message
+            </summary>
+        </member>
+        <member name="E:Rhino.Mocks.Expectations.AbstractExpectation.WhenCalled">
+            <summary>
+            Occurs when the exceptation is match on a method call
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.AllowTentativeReturn">
+            <summary>
+            Allow to set the return value in the future, if it was already set.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AbstractExpectation.ErrorMessage">
+            <summary>
+            Gets the error message.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Expectations.AnyArgsExpectation">
+            <summary>
+            Expectation that matches any arguments for the method.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AnyArgsExpectation.#ctor(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Impl.Range)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.AnyArgsExpectation"/> instance.
+            </summary>
+            <param name="invocation">Invocation for this expectation</param>
+            <param name="expectedRange">Number of method calls for this expectations</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AnyArgsExpectation.#ctor(Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.AnyArgsExpectation"/> instance.
+            </summary>
+            <param name="expectation">Expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AnyArgsExpectation.DoIsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method.
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AnyArgsExpectation.Equals(System.Object)">
+            <summary>
+            Determines if the object equal to expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.AnyArgsExpectation.GetHashCode">
+            <summary>
+            Get the hash code
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.AnyArgsExpectation.ErrorMessage">
+            <summary>
+            Gets the error message.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Expectations.ArgsEqualExpectation">
+            <summary>
+            Summary description for ArgsEqualExpectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ArgsEqualExpectation.#ctor(Castle.Core.Interceptor.IInvocation,System.Object[],Rhino.Mocks.Impl.Range)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.ArgsEqualExpectation"/> instance.
+            </summary>
+            <param name="expectedArgs">Expected args.</param>
+            <param name="invocation">The invocation for this expectation</param>
+            <param name="expectedRange">Number of method calls for this expectations</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ArgsEqualExpectation.DoIsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method.
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ArgsEqualExpectation.Equals(System.Object)">
+            <summary>
+            Determines if the object equal to expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ArgsEqualExpectation.GetHashCode">
+            <summary>
+            Get the hash code
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.ArgsEqualExpectation.ErrorMessage">
+            <summary>
+            Gets the error message.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.ArgsEqualExpectation.ExpectedArgs">
+            <summary>
+            Get the expected args.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Expectations.CallbackExpectation">
+            <summary>
+            Call a specified callback to verify the expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.CallbackExpectation.#ctor(Rhino.Mocks.Interfaces.IExpectation,System.Delegate)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.CallbackExpectation"/> instance.
+            </summary>
+            <param name="expectation">Expectation.</param>
+            <param name="callback">Callback.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.CallbackExpectation.#ctor(Castle.Core.Interceptor.IInvocation,System.Delegate,Rhino.Mocks.Impl.Range)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.CallbackExpectation"/> instance.
+            </summary>
+            <param name="invocation">Invocation for this expectation</param>
+            <param name="callback">Callback.</param>
+            <param name="expectedRange">Number of method calls for this expectations</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.CallbackExpectation.DoIsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method on the child methods
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.CallbackExpectation.Equals(System.Object)">
+            <summary>
+            Determines if the object equal to expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.CallbackExpectation.GetHashCode">
+            <summary>
+            Get the hash code
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.CallbackExpectation.ErrorMessage">
+            <summary>
+            Gets the error message.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Expectations.ConstraintsExpectation">
+            <summary>
+            Expect the method's arguments to match the contraints
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ConstraintsExpectation.#ctor(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Constraints.AbstractConstraint[],Rhino.Mocks.Impl.Range)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.ConstraintsExpectation"/> instance.
+            </summary>
+            <param name="invocation">Invocation for this expectation</param>
+            <param name="constraints">Constraints.</param>
+            <param name="expectedRange">Number of method calls for this expectations</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ConstraintsExpectation.#ctor(Rhino.Mocks.Interfaces.IExpectation,Rhino.Mocks.Constraints.AbstractConstraint[])">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Expectations.ConstraintsExpectation"/> instance.
+            </summary>
+            <param name="expectation">Expectation.</param>
+            <param name="constraints">Constraints.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ConstraintsExpectation.DoIsExpected(System.Object[])">
+            <summary>
+            Validate the arguments for the method.
+            </summary>
+            <param name="args">The arguments with which the method was called</param>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ConstraintsExpectation.Equals(System.Object)">
+            <summary>
+            Determines if the object equal to expectation
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Expectations.ConstraintsExpectation.GetHashCode">
+            <summary>
+            Get the hash code
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Expectations.ConstraintsExpectation.ErrorMessage">
+            <summary>
+            Gets the error message.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.NullLogger">
+            <summary>
+            Doesn't log anything, just makes happy noises
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IExpectationLogger">
+            <summary>
+            Log expectations - allows to see what is going on inside Rhino Mocks
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectationLogger.LogRecordedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as is was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectationLogger.LogReplayedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as it was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IExpectationLogger.LogUnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.String)">
+            <summary>
+            Logs the unexpected method call.
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.NullLogger.LogRecordedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as is was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.NullLogger.LogReplayedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as it was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.NullLogger.LogUnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.String)">
+            <summary>
+            Logs the unexpected method call.
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="message">The message.</param>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RemotingMock.IRemotingProxyOperation">
+            <summary>
+            Operation on a remoting proxy
+            </summary>
+            <remarks>
+            It is not possible to directly communicate to a real proxy via transparent proxy.
+            Transparent proxy impersonates a user type and only methods of that user type are callable.
+            The only methods that are guaranteed to exist on any transparent proxy are methods defined
+            in Object: namely ToString(), GetHashCode(), and Equals()).
+            
+            These three methods are the only way to tell the real proxy to do something.
+            Equals() is the most suitable of all, since it accepts an arbitrary object parameter.
+            The RemotingProxy code is built so that if it is compared to an IRemotingProxyOperation,
+            transparentProxy.Equals(operation) will call operation.Process(realProxy).
+            This way we can retrieve a real proxy from transparent proxy and perform
+            arbitrary operation on it. 
+            </remarks>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RemotingMock.RemotingMockGenerator">
+            <summary>
+            Generates remoting proxies and provides utility functions
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RemotingMock.RemotingMockGenerator.CreateRemotingMock(System.Type,Castle.Core.Interceptor.IInterceptor,Rhino.Mocks.Interfaces.IMockedObject)">
+            <summary>
+             Create the proxy using remoting
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RemotingMock.RemotingMockGenerator.IsRemotingProxy(System.Object)">
+            <summary>
+            Check whether an object is a transparent proxy with a RemotingProxy behind it
+            </summary>
+            <param name="obj">Object to check</param>
+            <returns>true if the object is a transparent proxy with a RemotingProxy instance behind it, false otherwise</returns>
+            <remarks>We use Equals() method to communicate with the real proxy behind the object.
+            See IRemotingProxyOperation for more details</remarks>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RemotingMock.RemotingMockGenerator.GetMockedObjectFromProxy(System.Object)">
+            <summary>
+            Retrieve a mocked object from a transparent proxy
+            </summary>
+            <param name="proxy">Transparent proxy with a RemotingProxy instance behind it</param>
+            <returns>Mocked object associated with the proxy</returns>
+            <remarks>We use Equals() method to communicate with the real proxy behind the object.
+            See IRemotingProxyOperation for more details</remarks>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RemotingMock.RemotingInvocation">
+            <summary>
+            Implementation of IInvocation based on remoting proxy
+            </summary>
+            <remarks>Some methods are marked NotSupported since they either don't make sense
+            for remoting proxies, or they are never called by Rhino Mocks</remarks>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.TextWriterExpectationLogger">
+            <summary>
+            Rudimetry implementation that simply logs methods calls as text.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TextWriterExpectationLogger.#ctor(System.IO.TextWriter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Impl.TextWriterExpectationLogger"/> class.
+            </summary>
+            <param name="writer">The writer.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TextWriterExpectationLogger.LogRecordedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as it was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TextWriterExpectationLogger.LogReplayedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as it was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TextWriterExpectationLogger.LogUnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.String)">
+            <summary>
+            Logs the unexpected method call.
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="message">The message.</param>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.StubRecordMockState">
+            <summary>
+            Behave like a stub, all properties and events acts normally, methods calls
+            return default values by default (but can use expectations to set them up), etc.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RecordMockState">
+            <summary>
+            Records all the expectations for a mock
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IMockState">
+            <summary>
+            Different actions on this mock
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.MethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.Verify">
+            <summary>
+            Verify that this mock expectations have passed.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.Replay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.GetLastMethodOptions``1">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.SetExceptionToThrowOnVerify(System.Exception)">
+            <summary>
+            Set the exception to throw when Verify is called.
+            This is used to report exception that may have happened but where caught in the code.
+            This way, they are reported anyway when Verify() is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockState.NotifyCallOnPropertyBehavior">
+            <summary>
+            This method is called to indicate that a property behavior call.
+            This is done so we generate good error message in the common case of people using
+            Stubbed properties with Return().
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockState.VerifyState">
+            <summary>
+            Gets the matching verify state for this state
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockState.LastMethodOptions">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.GetLastMethodOptions``1">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.SetExceptionToThrowOnVerify(System.Exception)">
+            <summary>
+            Set the exception to throw when Verify is called.
+            This is used to report exception that may have happened but where caught in the code.
+            This way, they are reported anyway when Verify() is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.NotifyCallOnPropertyBehavior">
+            <summary>
+            This method is called to indicate that a property behavior call.
+            This is done so we generate good error message in the common case of people using
+            Stubbed properties with Return().
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.#ctor(Rhino.Mocks.Interfaces.IMockedObject,Rhino.Mocks.MockRepository)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.RecordMockState"/> instance.
+            </summary>
+            <param name="repository">Repository.</param>
+            <param name="mockedObject">The proxy that generates the method calls</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.MethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.Replay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.DoReplay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.Verify">
+            <summary>
+            Verify that this mock expectations have passed.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.AssertPreviousMethodIsClose">
+            <summary>
+            Asserts the previous method is closed (had an expectation set on it so we can replay it correctly)
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordMockState.GetDefaultCallCountRangeExpectation">
+            <summary>
+            Get the default call count range expectation
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.RecordMockState.LastExpectation">
+            <summary>
+            Gets the last expectation.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.RecordMockState.MethodCallsCount">
+            <summary>
+            Gets the total method calls count.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.RecordMockState.LastMethodOptions">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.RecordMockState.VerifyState">
+            <summary>
+            Gets the matching verify state for this state
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubRecordMockState.#ctor(Rhino.Mocks.Interfaces.IMockedObject,Rhino.Mocks.MockRepository)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Impl.StubRecordMockState"/> class.
+            </summary>
+            <param name="mockedObject">The proxy that generates the method calls</param>
+            <param name="repository">Repository.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubRecordMockState.AssertPreviousMethodIsClose">
+            <summary>
+            We don't care much about expectations here, so we will remove the expectation if
+            it is not closed.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubRecordMockState.Replay">
+            <summary>
+            Verify that we can move to replay state and move
+            to the reply state.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubRecordMockState.GetDefaultCallCountRangeExpectation">
+            <summary>
+            Get the default call count range expectation
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.StubReplayMockState">
+            <summary>
+            Validate expectations on recorded methods, but in general completely ignoring them.
+            Similar to <seealso cref="T:Rhino.Mocks.Impl.ReplayDynamicMockState"/> except that it would return a 
+            <seealso cref="T:Rhino.Mocks.Impl.StubRecordMockState"/> when BackToRecord is called.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.ReplayMockState">
+            <summary>
+            Validate all expectations on a mock
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.ReplayMockState.repository">
+            <summary>
+            The repository for this state
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.ReplayMockState.proxy">
+            <summary>
+            The proxy object for this state
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.GetLastMethodOptions``1">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.#ctor(Rhino.Mocks.Impl.RecordMockState)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.ReplayMockState"/> instance.
+            </summary>
+            <param name="previousState">The previous state for this method</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.MethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.DoMethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            This allows derived method to cleanly get a the setupresult behavior while adding
+            their own.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.SetExceptionToThrowOnVerify(System.Exception)">
+            <summary>
+            Set the exception to throw when Verify is called.
+            This is used to report exception that may have happened but where caught in the code.
+            This way, they are reported anyway when Verify() is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.NotifyCallOnPropertyBehavior">
+            <summary>
+            not relevant
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.Verify">
+            <summary>
+            Verify that this mock expectations have passed.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.Replay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ReplayMockState.LastMethodOptions">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ReplayMockState.VerifyState">
+            <summary>
+            Gets the matching verify state for this state
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubReplayMockState.#ctor(Rhino.Mocks.Impl.RecordMockState)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Impl.StubReplayMockState"/> class.
+            </summary>
+            <param name="previousState">The previous state for this method</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubReplayMockState.DoMethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.StubReplayMockState.BackToRecord">
+            <summary>
+            Gets a mock state that matches the original mock state of the object.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.TraceWriterExpectationLogger">
+            <summary>
+            Write rhino mocks log info to the trace
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterExpectationLogger.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Impl.TraceWriterExpectationLogger"/> class.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterExpectationLogger.#ctor(System.Boolean,System.Boolean,System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.Impl.TraceWriterExpectationLogger"/> class.
+            </summary>
+            <param name="logRecorded">if set to <c>true</c> [log recorded].</param>
+            <param name="logReplayed">if set to <c>true</c> [log replayed].</param>
+            <param name="logUnexpected">if set to <c>true</c> [log unexpected].</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterExpectationLogger.LogRecordedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as is was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterExpectationLogger.LogReplayedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as it was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterExpectationLogger.LogUnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.String)">
+            <summary>
+            Logs the unexpected method call.
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="message">The message.</param>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.TraceWriterWithStackTraceExpectationWriter">
+            <summary>
+            Writes log information as stack traces about rhino mocks activity
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.TraceWriterWithStackTraceExpectationWriter.AlternativeWriter">
+            <summary>
+            Allows to redirect output to a different location.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterWithStackTraceExpectationWriter.LogRecordedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as is was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterWithStackTraceExpectationWriter.LogReplayedExpectation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Logs the expectation as it was recorded
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="expectation">The expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.TraceWriterWithStackTraceExpectationWriter.LogUnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.String)">
+            <summary>
+            Logs the unexpected method call.
+            </summary>
+            <param name="invocation">The invocation.</param>
+            <param name="message">The message.</param>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IPartialMockMarker">
+            <summary>
+            Marker interface used to indicate that this is a partial mock.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.OriginalCallOptions">
+            <summary>
+            Options for CallOriginalMethod
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Interfaces.OriginalCallOptions.NoExpectation">
+            <summary>
+            No expectation is created, the method will be called directly
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Interfaces.OriginalCallOptions.CreateExpectation">
+            <summary>
+            Normal expectation is created, but when the method is later called, it will also call the original method
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.MethodInvocation">
+            <summary>
+            This is a data structure that is used by 
+            <seealso cref="M:Rhino.Mocks.Interfaces.IMethodOptions`1.WhenCalled(System.Action{Rhino.Mocks.MethodInvocation})"/> to pass
+            the current method to the relevant delegate
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodInvocation.#ctor(Castle.Core.Interceptor.IInvocation)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Rhino.Mocks.MethodInvocation"/> class.
+            </summary>
+            <param name="invocation">The invocation.</param>
+        </member>
+        <member name="P:Rhino.Mocks.MethodInvocation.Arguments">
+            <summary>
+            Gets the args for this method invocation
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.MethodInvocation.Method">
+            <summary>
+            Get the method that was caused this invocation
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.MethodInvocation.ReturnValue">
+            <summary>
+            Gets or sets the return value for this method invocation
+            </summary>
+            <value>The return value.</value>
+        </member>
+        <member name="T:Rhino.Mocks.MockRepository">
+            <summary>
+             Adds optional new usage:
+               using(mockRepository.Record()) {
+                  Expect.Call(mock.Method()).Return(retVal);
+               }
+               using(mockRepository.Playback()) {
+                  // Execute code
+               }
+             N.B. mockRepository.ReplayAll() and mockRepository.VerifyAll()
+                  calls are taken care of by Record/Playback
+            </summary>
+            <summary>
+            Creates proxied instances of types.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStub``1(System.Object[])">
+            <summary>Generates a stub without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="argumentsForConstructor">Arguments for <typeparamref name="T"/>'s constructor</param>
+            <typeparam name="T">The <see cref="T:System.Type"/> of stub to create.</typeparam>
+            <returns>The stub</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.Stub``1(System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStub(System.Type,System.Object[])">
+            <summary>Generates a stub without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="type">The <see cref="T:System.Type"/> of stub.</param>
+            <param name="argumentsForConstructor">Arguments for the <paramref name="type"/>'s constructor.</param>
+            <returns>The stub</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.Stub(System.Type,System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateMock``1(System.Object[])">
+            <summary>Generate a mock object without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <typeparam name="T">type <see cref="T:System.Type"/> of mock object to create.</typeparam>
+            <param name="argumentsForConstructor">Arguments for <typeparamref name="T"/>'s constructor</param>
+            <returns>the mock object</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.DynamicMock``1(System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateMock``2(System.Object[])">
+            <summary>Generate a multi-mock object without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <typeparam name="T">The <c>typeof</c> object to generate a mock for.</typeparam>
+            <typeparam name="TMultiMockInterface1">A second interface to generate a multi-mock for.</typeparam>
+            <param name="argumentsForConstructor">Arguments for <typeparamref name="T"/>'s constructor</param>
+            <returns>the multi-mock object</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.DynamicMultiMock(System.Type,System.Type[],System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateMock``3(System.Object[])">
+            <summary>Generate a multi-mock object without without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <typeparam name="T">The <c>typeof</c> object to generate a mock for.</typeparam>
+            <typeparam name="TMultiMockInterface1">An interface to generate a multi-mock for.</typeparam>
+            <typeparam name="TMultiMockInterface2">A second interface to generate a multi-mock for.</typeparam>
+            <param name="argumentsForConstructor">Arguments for <typeparamref name="T"/>'s constructor</param>
+            <returns>the multi-mock object</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.DynamicMultiMock(System.Type,System.Type[],System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateMock(System.Type,System.Type[],System.Object[])">
+            <summary>Creates a multi-mock without without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="type">The type of mock to create, this can be a class</param>
+            <param name="extraTypes">Any extra interfaces to add to the multi-mock, these can only be interfaces.</param>
+            <param name="argumentsForConstructor">Arguments for <paramref name="type"/>'s constructor</param>
+            <returns>the multi-mock object</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.DynamicMultiMock(System.Type,System.Type[],System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStrictMock``1(System.Object[])">
+            <summary>Creates a strict mock without without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="argumentsForConstructor">Any arguments required for the <typeparamref name="T"/>'s constructor</param>
+            <typeparam name="T">The type of mock object to create.</typeparam>
+            <returns>The mock object with strict replay semantics</returns>
+             <seealso cref="M:Rhino.Mocks.MockRepository.StrictMock``1(System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStrictMock``2(System.Object[])">
+            <summary>Creates a strict multi-mock without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="argumentsForConstructor">Any arguments required for the <typeparamref name="T"/>'s constructor</param>
+            <typeparam name="T">The type of mock object to create, this can be a class.</typeparam>
+            <typeparam name="TMultiMockInterface1">An interface to generate a multi-mock for, this must be an interface!</typeparam>
+            <returns>The multi-mock object with strict replay semantics</returns>
+             <seealso cref="M:Rhino.Mocks.MockRepository.StrictMultiMock(System.Type,System.Type[],System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStrictMock``3(System.Object[])">
+            <summary>Creates a strict multi-mock without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="argumentsForConstructor">Any arguments required for the <typeparamref name="T"/>'s constructor</param>
+            <typeparam name="T">The type of mock object to create, this can be a class.</typeparam>
+            <typeparam name="TMultiMockInterface1">An interface to generate a multi-mock for, this must be an interface!</typeparam>
+            <typeparam name="TMultiMockInterface2">A second interface to generate a multi-mock for, this must be an interface!</typeparam>
+            <returns>The multi-mock object with strict replay semantics</returns>
+            <seealso cref="M:Rhino.Mocks.MockRepository.StrictMultiMock(System.Type,System.Type[],System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStrictMock(System.Type,System.Type[],System.Object[])">
+            <summary>Creates a strict multi-mock without needing a <see cref="T:Rhino.Mocks.MockRepository"/></summary>
+            <param name="type">The type of mock object to create, this can be a class</param>
+            <param name="extraTypes">Any extra interfaces to generate a multi-mock for, these must be interaces!</param>
+            <param name="argumentsForConstructor">Any arguments for the <paramref name="type"/>'s constructor</param>
+            <returns>The strict multi-mock object</returns>
+             <seealso cref="M:Rhino.Mocks.MockRepository.StrictMultiMock(System.Type,System.Type[],System.Object[])"/>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GeneratePartialMock``1(System.Object[])">
+            <summary>
+            </summary>
+            <param name="argumentsForConstructor"></param>
+            <typeparam name="T"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GeneratePartialMock``2(System.Object[])">
+            <summary>
+            </summary>
+            <param name="argumentsForConstructor"></param>
+            <typeparam name="T"></typeparam>
+            <typeparam name="TMultiMockInterface1"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GeneratePartialMock``3(System.Object[])">
+            <summary>
+            </summary>
+            <param name="argumentsForConstructor"></param>
+            <typeparam name="T"></typeparam>
+            <typeparam name="TMultiMockInterface1"></typeparam>
+            <typeparam name="TMultiMockInterface2"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GeneratePartialMock(System.Type,System.Type[],System.Object[])">
+            <summary>
+            </summary>
+            <param name="type"></param>
+            <param name="extraTypes"></param>
+            <param name="argumentsForConstructor"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateDynamicMockWithRemoting``1(System.Object[])">
+            <summary>
+            Generate a mock object with dynamic replay semantics and remoting without needing the mock repository
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GenerateStrictMockWithRemoting``1(System.Object[])">
+            <summary>
+            Generate a mock object with strict replay semantics and remoting without needing the mock repository
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMockInReplay``1(System.Func{Rhino.Mocks.MockRepository,``0})">
+            <summary>Helper method to create a mock object without a repository instance and put the object back into replay mode.</summary>
+            <typeparam name="T">The type of mock object to create</typeparam>
+            <param name="createMock">A delegate that uses a mock repository instance to create the underlying mock</param>
+            <returns>The mock object in the replay mode.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Record">
+            <summary>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Playback">
+            <summary>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="F:Rhino.Mocks.MockRepository.generatorMap">
+            <summary>
+            This is a map of types to ProxyGenerators.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MockRepository.lastRepository">
+            <summary>
+            This is used to record the last repository that has a method called on it.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MockRepository.lastMockedObject">
+            <summary>
+            this is used to get to the last proxy on this repository.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MockRepository.delegateProxies">
+            <summary>
+            For mock delegates, maps the proxy instance from intercepted invocations
+            back to the delegate that was originally returned to client code, if any.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MockRepository.proxies">
+            <summary>
+            All the proxies in the mock repositories
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MockRepository.repeatableMethods">
+            <summary>
+            This is here because we can't put it in any of the recorders, since repeatable methods
+            have no orderring, and if we try to handle them using the usual manner, we would get into
+            wierd situations where repeatable method that was defined in an orderring block doesn't
+            exists until we enter this block.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.#ctor">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MockRepository"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Ordered">
+            <summary>
+            Move the repository to ordered mode
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Unordered">
+            <summary>
+            Move the repository to un-ordered mode
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMock(System.Type,System.Object[])">
+            <summary>
+            Creates a mock for the specified type.
+            </summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMock(System.Type,System.Object[])">
+            <summary>
+            Creates a strict mock for the specified type.
+            </summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMockWithRemoting(System.Type,System.Object[])">
+            <summary>
+            Creates a remoting mock for the specified type.
+            </summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMockWithRemoting(System.Type,System.Object[])">
+            <summary>
+            Creates a strict remoting mock for the specified type.
+            </summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMockWithRemoting``1(System.Object[])">
+            <summary>
+            Creates a remoting mock for the specified type.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMockWithRemoting``1(System.Object[])">
+            <summary>
+            Creates a strict remoting mock for the specified type.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMultiMock(System.Type,System.Type[])">
+            <summary>
+            Creates a mock from several types, with strict semantics.
+            Only <paramref name="mainType"/> may be a class.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMultiMock(System.Type,System.Type[])">
+            <summary>
+            Creates a strict mock from several types, with strict semantics.
+            Only <paramref name="mainType"/> may be a class.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMultiMock(System.Type,System.Type[],System.Object[])">
+            <summary>
+            Creates a mock from several types, with strict semantics.
+            Only <paramref name="mainType"/> may be a class.
+            </summary>
+            <param name="mainType">The main type to mock.</param>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMultiMock(System.Type,System.Type[],System.Object[])">
+            <summary>
+            Creates a strict mock from several types, with strict semantics.
+            Only <paramref name="mainType"/> may be a class.
+            </summary>
+            <param name="mainType">The main type to mock.</param>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMultiMock(System.Type,System.Type[])">
+            <summary>
+            Creates a mock from several types, with dynamic semantics.
+            Only <paramref name="mainType"/> may be a class.
+            </summary>
+            <param name="mainType">The main type to mock.</param>
+            <param name="extraTypes">Extra interface types to mock.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMultiMock(System.Type,System.Type[],System.Object[])">
+            <summary>
+            Creates a mock from several types, with dynamic semantics.
+            Only <paramref name="mainType"/> may be a class.
+            </summary>
+            <param name="mainType">The main type to mock.</param>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMock(System.Type,System.Object[])">
+            <summary>Creates a dynamic mock for the specified type.</summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMockWithRemoting(System.Type,System.Object[])">
+            <summary>Creates a dynamic mock for the specified type.</summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMockWithRemoting``1(System.Object[])">
+            <summary>Creates a dynamic mock for the specified type.</summary>
+            <typeparam name="T"></typeparam>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PartialMock(System.Type,System.Object[])">
+            <summary>Creates a mock object that defaults to calling the class methods if no expectation is set on the method.</summary>
+            <param name="type">Type.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PartialMultiMock(System.Type,System.Type[])">
+            <summary>Creates a mock object that defaults to calling the class methods.</summary>
+            <param name="type">Type.</param>
+            <param name="extraTypes">Extra interface types to mock.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PartialMultiMock(System.Type,System.Type[],System.Object[])">
+            <summary>Creates a mock object that defaults to calling the class methods.</summary>
+            <param name="type">Type.</param>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.RemotingMock(System.Type,Rhino.Mocks.MockRepository.CreateMockState)">
+            <summary>Creates a mock object using remoting proxies</summary>
+            <param name="type">Type to mock - must be MarshalByRefObject</param>
+            <returns>Mock object</returns>
+            <remarks>Proxy mock can mock non-virtual methods, but not static methods</remarks>
+            <param name="factory">Creates the mock state for this proxy</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Replay(System.Object)">
+            <summary>
+            Cause the mock state to change to replay, any further call is compared to the 
+            ones that were called in the record state.
+            </summary>
+            <remarks>This method *cannot* be called from inside an ordering.</remarks>
+            <param name="obj">the object to move to replay state</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.ReplayCore(System.Object,System.Boolean)">
+            <summary>
+            Cause the mock state to change to replay, any further call is compared to the 
+            ones that were called in the record state.
+            </summary>
+            <param name="obj">the object to move to replay state</param>
+            <param name="checkInsideOrdering"></param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.BackToRecord(System.Object)">
+            <summary>Move the mocked object back to record state.<para>You can (and it's recommended) to run {Verify()} before you use this method.</para></summary>
+            <remarks>Will delete all current expectations!</remarks>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.BackToRecord(System.Object,Rhino.Mocks.BackToRecordOptions)">
+            <summary>
+            Move the mocked object back to record state.
+            Optionally, can delete all current expectations, but allows more granularity about how
+            it would behave with regard to the object state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Verify(System.Object)">
+            <summary>
+            Verify that all the expectations for this object were fulfilled.
+            </summary>
+            <param name="obj">the object to verify the expectations for</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.LastMethodCall``1(System.Object)">
+            <summary>
+            Get the method options for the last call on
+            mockedInstance.
+            </summary>
+            <param name="mockedInstance">The mock object</param>
+            <returns>Method options for the last call</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GetMockObjectFromInvocationProxy(System.Object)">
+            <summary>
+            Maps an invocation proxy back to the mock object instance that was originally
+            returned to client code which might have been a delegate to this proxy.
+            </summary>
+            <param name="invocationProxy">The mock object proxy from the intercepted invocation</param>
+            <returns>The mock object</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMockObject(System.Type,Rhino.Mocks.MockRepository.CreateMockState,System.Type[],System.Object[])">
+            <summary>This is provided to allow advance extention functionality, where Rhino Mocks standard functionality is not enough.</summary>
+            <param name="type">The type to mock</param>
+            <param name="factory">Delegate that create the first state of the mocked object (usualy the record state).</param>
+            <param name="extras">Additional types to be implemented, this can be only interfaces </param>
+            <param name="argumentsForConstructor">optional arguments for the constructor</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GetMockedObject(System.Object)">
+            <summary>
+             Method: GetMockedObject
+             Get an IProxy from a mocked object instance, or throws if the 
+             object is not a mock object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GetMockedObjectOrNull(System.Object)">
+            <summary>
+            Method: GetMockedObjectOrNull
+            Get an IProxy from a mocked object instance, or null if the
+            object is not a mock object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PopRecorder">
+            <summary>Pops the recorder.</summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PushRecorder(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>Pushes the recorder.</summary>
+            <param name="newRecorder">New recorder.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.BackToRecordAll">
+            <summary>
+            All the mock objects in this repository will be moved
+            to record state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.BackToRecordAll(Rhino.Mocks.BackToRecordOptions)">
+            <summary>
+            All the mock objects in this repository will be moved
+            to record state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.ReplayAll">
+            <summary>
+            Replay all the mocks from this repository
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.VerifyAll">
+            <summary>
+            Verify all the mocks from this repository
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.GetProxyGenerator(System.Type)">
+            <summary>
+            Gets the proxy generator for a specific type. Having a single ProxyGenerator
+            with multiple types linearly degrades the performance so this implementation
+            keeps one ProxyGenerator per type. 
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.SetExceptionToBeThrownOnVerify(System.Object,Rhino.Mocks.Exceptions.ExpectationViolationException)">
+            <summary>Set the exception to be thrown when verified is called.</summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMock``1(System.Object[])">
+            <summary>
+            Creates a mock for the spesified type with strict mocking semantics.
+            <para>Strict semantics means that any call that wasn't explicitly recorded is considered an error and would cause an exception to be thrown.</para>
+            </summary>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMock``1(System.Object[])">
+            <summary>
+            Creates a mock for the spesified type with strict mocking semantics.
+            <para>Strict semantics means that any call that wasn't explicitly recorded is considered an error and would cause an exception to be thrown.</para>
+            </summary>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMock``1(System.Object[])">
+            <summary>
+            Creates a dynamic mock for the specified type.
+            </summary>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMultiMock``1(System.Type[])">
+            <summary>
+            Creates a mock object from several types.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMultiMock``1(System.Type[])">
+            <summary>
+            Creates a strict mock object from several types.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMultiMock``1(System.Type[])">
+            <summary>
+            Create a mock object from several types with dynamic semantics.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PartialMultiMock``1(System.Type[])">
+            <summary>
+            Create a mock object from several types with partial semantics.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.CreateMultiMock``1(System.Type[],System.Object[])">
+            <summary>
+            Create a mock object from several types with strict semantics.
+            </summary>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.StrictMultiMock``1(System.Type[],System.Object[])">
+            <summary>
+            Create a strict mock object from several types with strict semantics.
+            </summary>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.DynamicMultiMock``1(System.Type[],System.Object[])">
+            <summary>
+            Create a mock object from several types with dynamic semantics.
+            </summary>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PartialMultiMock``1(System.Type[],System.Object[])">
+            <summary>
+            Create a mock object from several types with partial semantics.
+            </summary>
+            <param name="extraTypes">Extra interface types to mock.</param>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.PartialMock``1(System.Object[])">
+            <summary>
+            Create a mock object with from a class that defaults to calling the class methods
+            </summary>
+            <param name="argumentsForConstructor">Arguments for the class' constructor, if mocking a concrete class</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Stub``1(System.Object[])">
+            <summary>
+            Create a stub object, one that has properties and events ready for use, and 
+            can have methods called on it. It requires an explicit step in order to create 
+            an expectation for a stub.
+            </summary>
+            <param name="argumentsForConstructor">The arguments for constructor.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.Stub(System.Type,System.Object[])">
+            <summary>
+            Create a stub object, one that has properties and events ready for use, and
+            can have methods called on it. It requires an explicit step in order to create
+            an expectation for a stub.
+            </summary>
+            <param name="type">The type.</param>
+            <param name="argumentsForConstructor">The arguments for constructor.</param>
+            <returns>The stub</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.IsInReplayMode(System.Object)">
+            <summary>
+            Returns true if the passed mock is currently in replay mode.
+            </summary>
+            <param name="mock">The mock to test.</param>
+            <returns>True if the mock is in replay mode, false otherwise.</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.IsStub(System.Object)">
+            <summary>
+            Determines whether the specified proxy is a stub.
+            </summary>
+            <param name="proxy">The proxy.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MockRepository.RegisterPropertyBehaviorOn(Rhino.Mocks.Interfaces.IMockedObject)">
+            <summary>
+            Register a call on a prperty behavior 
+            </summary>
+            <param name="instance"></param>
+        </member>
+        <member name="P:Rhino.Mocks.MockRepository.Recorder">
+            <summary>
+            Gets the recorder.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.MockRepository.Replayer">
+            <summary>
+            Gets the replayer for this repository.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.MockRepository.LastMockedObject">
+            <summary>
+            Gets the last proxy which had a method call.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.MockRepository.CreateMockState">
+            <summary>
+             Delegate: CreateMockState
+             This is used internally to cleanly handle the creation of different 
+             RecordMockStates.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.RhinoMocksExtensions">
+            <summary>
+            A set of extension methods that adds Arrange Act Assert mode to Rhino Mocks
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Expect``1(``0,System.Action{``0})">
+            <summary>
+            Create an expectation on this mock for this action to occur
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.BackToRecord``1(``0)">
+            <summary>
+            Reset all expectations on this mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.BackToRecord``1(``0,Rhino.Mocks.BackToRecordOptions)">
+            <summary>
+            Reset the selected expectation on this mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="options">The options to reset the expectations on this mock.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Replay``1(``0)">
+            <summary>
+            Cause the mock state to change to replay, any further call is compared to the 
+            ones that were called in the record state.
+            </summary>
+            <param name="mock">the mocked object to move to replay state</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetMockRepository``1(``0)">
+            <summary>
+            Gets the mock repository for this specificied mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Expect``2(``0,Rhino.Mocks.Function{``0,``1})">
+            <summary>
+            Create an expectation on this mock for this action to occur
+            </summary>
+            <typeparam name="T"></typeparam>
+            <typeparam name="R"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Stub``1(``0,System.Action{``0})">
+            <summary>
+            Tell the mock object to perform a certain action when a matching 
+            method is called.
+            Does not create an expectation for this method.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Stub``2(``0,Rhino.Mocks.Function{``0,``1})">
+            <summary>
+            Tell the mock object to perform a certain action when a matching
+            method is called.
+            Does not create an expectation for this method.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <typeparam name="R"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetArgumentsForCallsMadeOn``1(``0,System.Action{``0})">
+            <summary>
+            Gets the arguments for calls made on this mock object and the method that was called
+            in the action.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <returns></returns>
+            <example>
+            Here we will get all the arguments for all the calls made to DoSomething(int)
+            <code>
+            var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0))
+            </code>
+            </example>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetArgumentsForCallsMadeOn``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
+            <summary>
+            Gets the arguments for calls made on this mock object and the method that was called
+            in the action and matches the given constraints
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <param name="setupConstraints">The setup constraints.</param>
+            <returns></returns>
+            <example>
+            Here we will get all the arguments for all the calls made to DoSomething(int)
+            <code>
+            var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0))
+            </code>
+            </example>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Action{``0})">
+            <summary>
+            Asserts that a particular method was called on this mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
+            <summary>
+            Asserts that a particular method was called on this mock object that match
+            a particular constraint set.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <param name="setupConstraints">The setup constraints.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Func{``0,System.Object})">
+            <summary>
+            Asserts that a particular method was called on this mock object that match
+            a particular constraint set.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Func{``0,System.Object},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
+            <summary>
+            Asserts that a particular method was called on this mock object that match
+            a particular constraint set.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <param name="setupConstraints">The setup constraints.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Action{``0})">
+            <summary>
+            Asserts that a particular method was NOT called on this mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
+            <summary>
+            Asserts that a particular method was NOT called on this mock object that match
+            a particular constraint set.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <param name="setupConstraints">The setup constraints.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Func{``0,System.Object})">
+            <summary>
+            Asserts that a particular method was NOT called on this mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Func{``0,System.Object},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
+            <summary>
+            Asserts that a particular method was NOT called on this mock object
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="mock">The mock.</param>
+            <param name="action">The action.</param>
+            <param name="setupConstraints">The setup constraints.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.FindAppropriteType``1(Rhino.Mocks.Interfaces.IMockedObject)">
+            <summary>
+            Finds the approprite implementation type of this item.
+            This is the class or an interface outside of the rhino mocks.
+            </summary>
+            <param name="mockedObj">The mocked obj.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.VerifyAllExpectations(System.Object)">
+            <summary>
+            Verifies all expectations on this mock object
+            </summary>
+            <param name="mockObject">The mock object.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetEventRaiser``1(``0,System.Action{``0})">
+            <summary>
+            Gets the event raiser for the event that was called in the action passed
+            </summary>
+            <typeparam name="TEventSource">The type of the event source.</typeparam>
+            <param name="mockObject">The mock object.</param>
+            <param name="eventSubscription">The event subscription.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Raise``1(``0,System.Action{``0},System.Object,System.EventArgs)">
+            <summary>
+            Raise the specified event using the passed arguments.
+            The even is extracted from the passed labmda
+            </summary>
+            <typeparam name="TEventSource">The type of the event source.</typeparam>
+            <param name="mockObject">The mock object.</param>
+            <param name="eventSubscription">The event subscription.</param>
+            <param name="sender">The sender.</param>
+            <param name="args">The <see cref="T:System.EventArgs"/> instance containing the event data.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Raise``1(``0,System.Action{``0},System.Object[])">
+            <summary>
+            Raise the specified event using the passed arguments.
+            The even is extracted from the passed labmda
+            </summary>
+            <typeparam name="TEventSource">The type of the event source.</typeparam>
+            <param name="mockObject">The mock object.</param>
+            <param name="eventSubscription">The event subscription.</param>
+            <param name="args">The args.</param>
+        </member>
+        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertExactlySingleExpectaton``1(Rhino.Mocks.MockRepository,``0)">
+            <summary>TODO: Make this better!  It currently breaks down when mocking classes or
+            ABC's that call other virtual methods which are getting intercepted too.  I wish
+            we could just walk Expression{Action{Action{T}} to assert only a single
+            method is being made.
+            
+            The workaround is to not call foo.AssertWasCalled .. rather foo.VerifyAllExpectations()</summary>
+            <typeparam name="T">The type of mock object</typeparam>
+            <param name="mocks">The mock repository</param>
+            <param name="mockToRecordExpectation">The actual mock object to assert expectations on.</param>
+        </member>
+        <member name="T:Rhino.Mocks.RhinoMocksExtensions.VoidType">
+            <summary>
+            Fake type that disallow creating it.
+            Should have been System.Type, but we can't use it.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Utilities.GenericsUtil">
+            <summary>
+            Utility class for dealing with messing generics scenarios.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Utilities.GenericsUtil.HasOpenGenericParam(System.Type)">
+            <summary>
+            There are issues with trying to get this to work correctly with open generic types, since this is an edge case, 
+            I am letting the runtime handle it.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Utilities.GenericsUtil.GetRealType(System.Type,Castle.Core.Interceptor.IInvocation)">
+            <summary>
+            Gets the real type, including de-constructing and constructing the type of generic
+            methods parameters.
+            </summary>
+            <param name="type">The type.</param>
+            <param name="invocation">The invocation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Utilities.GenericsUtil.ReconstructGenericType(System.Type,System.Collections.Generic.Dictionary{System.String,System.Type})">
+            <summary>
+            Because we need to support complex types here (simple generics were handled above) we
+            need to be aware of the following scenarios:
+            List[T] and List[Foo[T]]
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Generated.ExpectationsList">
+            <summary>
+            ExpectationsList
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary">
+            <summary>
+            Dictionary
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Generated.ProxyStateDictionary">
+            <summary>
+            Dictionary class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Generated.ProxyStateDictionary.#ctor">
+            <summary>
+            Create a new instance of <c>ProxyStateDictionary</c>
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.CreateMethodExpectation">
+            <summary>
+            Allows to call a method and immediately get it's options.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.ICreateMethodExpectation">
+            <summary>
+            Interface to allow calling a method and immediately get it's options.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.ICreateMethodExpectation.Call``1(``0)">
+            <summary>
+            Get the method options for the call
+            </summary>
+            <param name="ignored">The method call should go here, the return value is ignored</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.CreateMethodExpectation.#ctor(Rhino.Mocks.Interfaces.IMockedObject,System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.CreateMethodExpectation"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.CreateMethodExpectation.Call``1(``0)">
+            <summary>
+            Get the method options for the call
+            </summary>
+            <param name="ignored">The method call should go here, the return value is ignored</param>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.CreateMethodExpectationForSetupResult">
+            <summary>
+            Allows to call a method and immediately get it's options.
+            Set the expected number for the call to Any() 
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.CreateMethodExpectationForSetupResult.#ctor(Rhino.Mocks.Interfaces.IMockedObject,System.Object)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.CreateMethodExpectationForSetupResult"/> instance.
+            </summary>
+            <param name="mockedObject">Proxy.</param>
+            <param name="mockedInstance">Mocked instance.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.CreateMethodExpectationForSetupResult.Call``1(``0)">
+            <summary>
+            Get the method options for the call
+            </summary>
+            <param name="ignored">The method call should go here, the return value is ignored</param>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.DelegateTargetInterfaceCreator">
+            <summary>
+            This class is reponsible for taking a delegate and creating a wrapper
+            interface around it, so it can be mocked.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.DelegateTargetInterfaceCreator.moduleScope">
+            <summary>
+            The scope for all the delegate interfaces create by this mock repository.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.DelegateTargetInterfaceCreator.GetDelegateTargetInterface(System.Type)">
+            <summary>
+            Gets a type with an "Invoke" method suitable for use as a target of the
+            specified delegate type.
+            </summary>
+            <param name="delegateType"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.EventRaiser">
+            <summary>
+            Raise events for all subscribers for an event
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IEventRaiser">
+            <summary>
+            Raise events for all subscribers for an event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IEventRaiser.Raise(System.Object[])">
+            <summary>
+            Raise the event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IEventRaiser.Raise(System.Object,System.EventArgs)">
+            <summary>
+            The most common form for the event handler signature
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.EventRaiser.Create(System.Object,System.String)">
+            <summary>
+             Create an event raiser for the specified event on this instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.EventRaiser.#ctor(Rhino.Mocks.Interfaces.IMockedObject,System.String)">
+            <summary>
+            Creates a new instance of <c>EventRaiser</c>
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.EventRaiser.Raise(System.Object[])">
+            <summary>
+            Raise the event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.EventRaiser.Raise(System.Object,System.EventArgs)">
+            <summary>
+            The most common signature for events
+            Here to allow intellisense to make better guesses about how 
+            it should suggest parameters.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.MethodOptions`1">
+            <summary>
+            Allows to define what would happen when a method 
+            is called.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IMethodOptions`1">
+            <summary>
+            Allows to define what would happen when a method 
+            is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Return(`0)">
+            <summary>
+            Set the return value for the method.
+            </summary>
+            <param name="objToReturn">The object the method will return</param>
+            <returns>IRepeat that defines how many times the method will return this value</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.TentativeReturn">
+            <summary>
+            Allow to override this return value in the future
+            </summary>
+            <returns>IRepeat that defines how many times the method will return this value</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Throw(System.Exception)">
+            <summary>
+            Throws the specified exception when the method is called.
+            </summary>
+            <param name="exception">Exception to throw</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.IgnoreArguments">
+            <summary>
+            Ignores the arguments for this method. Any argument will be matched
+            againt this method.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Constraints(Rhino.Mocks.Constraints.AbstractConstraint[])">
+            <summary>
+            Add constraints for the method's arguments.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback(System.Delegate)">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback(Rhino.Mocks.Delegates.Function{System.Boolean})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``1(Rhino.Mocks.Delegates.Function{System.Boolean,``0})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``2(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``3(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``4(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``5(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``6(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``7(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``8(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``9(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7,``8})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Callback``10(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7,``8,``9})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Do(System.Delegate)">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.WhenCalled(System.Action{Rhino.Mocks.MethodInvocation})">
+            <summary>
+            Set a delegate to be called when the expectation is matched
+            and allow to optionally modify the invocation as needed
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.CallOriginalMethod">
+            <summary>
+            Call the original method on the class, bypassing the mocking layers.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.CallOriginalMethod(Rhino.Mocks.Interfaces.OriginalCallOptions)">
+            <summary>
+            Call the original method on the class, optionally bypassing the mocking layers.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.PropertyBehavior">
+            <summary>
+            Use the property as a simple property, getting/setting the values without
+            causing mock expectations.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.SetPropertyAndIgnoreArgument">
+            <summary>
+            Expect last (property) call as property setting, ignore the argument given
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.SetPropertyWithArgument(`0)">
+            <summary>
+            Expect last (property) call as property setting with a given argument.
+            </summary>
+            <param name="argument"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.GetEventRaiser">
+            <summary>
+            Get an event raiser for the last subscribed event.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.OutRef(System.Object[])">
+            <summary>
+            Set the parameter values for out and ref parameters.
+            This is done using zero based indexing, and _ignoring_ any non out/ref parameter.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodOptions`1.Message(System.String)">
+            <summary>
+            Documentation message for the expectation
+            </summary>
+            <param name="documentationMessage">Message</param>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMethodOptions`1.Repeat">
+            <summary>
+            Better syntax to define repeats. 
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IRepeat`1">
+            <summary>
+            Allows to specify the number of time for method calls
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.Twice">
+            <summary>
+            Repeat the method twice.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.Once">
+            <summary>
+            Repeat the method once.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.AtLeastOnce">
+            <summary>
+            Repeat the method at least once, then repeat as many time as it would like.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.Any">
+            <summary>
+            Repeat the method any number of times.
+            This has special affects in that this method would now ignore orderring.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.Times(System.Int32,System.Int32)">
+            <summary>
+            Set the range to repeat an action.
+            </summary>
+            <param name="min">Min.</param>
+            <param name="max">Max.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.Times(System.Int32)">
+            <summary>
+            Set the amount of times to repeat an action.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IRepeat`1.Never">
+            <summary>
+            This method must not appear in the replay state.
+            This has special affects in that this method would now ignore orderring.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.#ctor(Rhino.Mocks.MockRepository,Rhino.Mocks.Impl.RecordMockState,Rhino.Mocks.Interfaces.IMockedObject,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Interfaces.IMethodOptions`1"/> instance.
+            </summary>
+            <param name="repository">the repository for this expectation</param>
+            <param name="record">the recorder for this proxy</param>
+            <param name="proxy">the proxy for this expectation</param>
+            <param name="expectation">Expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Constraints(Rhino.Mocks.Constraints.AbstractConstraint[])">
+            <summary>
+            Add constraints for the method's arguments.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback(System.Delegate)">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback(Rhino.Mocks.Delegates.Function{System.Boolean})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``1(Rhino.Mocks.Delegates.Function{System.Boolean,``0})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``2(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``3(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``4(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``5(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``6(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``7(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``8(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``9(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7,``8})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Callback``10(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7,``8,``9})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Do(System.Delegate)">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.WhenCalled(System.Action{Rhino.Mocks.MethodInvocation})">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Return(`0)">
+            <summary>
+            Set the return value for the method.
+            </summary>
+            <param name="objToReturn">The object the method will return</param>
+            <returns>IRepeat that defines how many times the method will return this value</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.TentativeReturn">
+            <summary>
+            Set the return value for the method, but allow to override this return value in the future
+            </summary>
+            <returns>IRepeat that defines how many times the method will return this value</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Throw(System.Exception)">
+            <summary>
+            Throws the specified exception when the method is called.
+            </summary>
+            <param name="exception">Exception to throw</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.IgnoreArguments">
+            <summary>
+            Ignores the arguments for this method. Any argument will be matched
+            againt this method.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.CallOriginalMethod">
+            <summary>
+            Call the original method on the class, bypassing the mocking layers.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.CallOriginalMethod(Rhino.Mocks.Interfaces.OriginalCallOptions)">
+            <summary>
+            Call the original method on the class, optionally bypassing the mocking layers
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.PropertyBehavior">
+            <summary>
+            Use the property as a simple property, getting/setting the values without
+            causing mock expectations.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.SetPropertyAndIgnoreArgument">
+            <summary>
+            Expect last (property) call as property setting, ignore the argument given
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.SetPropertyWithArgument(`0)">
+            <summary>
+            Expect last (property) call as property setting with a given argument.
+            </summary>
+            <param name="argument"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.GetEventRaiser">
+            <summary>
+            Gets the event raiser for the last event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.OutRef(System.Object[])">
+            <summary>
+            Set the parameter values for out and ref parameters.
+            This is done using zero based indexing, and _ignoring_ any non out/ref parameter.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Twice">
+            <summary>
+            Repeat the method twice.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Once">
+            <summary>
+            Repeat the method once.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.AtLeastOnce">
+            <summary>
+            Repeat the method at least once, then repeat as many time as it would like.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Never">
+            <summary>
+            This method must not appear in the replay state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Message(System.String)">
+            <summary>
+            Documentation message for the expectation
+            </summary>
+            <param name="documentationMessage">Message</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Any">
+            <summary>
+            Repeat the method any number of times.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Times(System.Int32,System.Int32)">
+            <summary>
+            Set the range to repeat an action.
+            </summary>
+            <param name="min">Min.</param>
+            <param name="max">Max.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MethodOptions`1.Times(System.Int32)">
+            <summary>
+            Set the amount of times to repeat an action.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.MethodOptions`1.Repeat">
+            <summary>
+            Better syntax to define repeats. 
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.MockedObjectsEquality">
+            <summary>
+            This class will provide hash code for hashtables without needing
+            to call the GetHashCode() on the object, which may very well be mocked.
+            This class has no state so it is a singelton to avoid creating a lot of objects 
+            that does the exact same thing. See flyweight patterns.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MockedObjectsEquality.GetHashCode(System.Object)">
+            <summary>
+            Get the hash code for a proxy object without calling GetHashCode()
+            on the object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MockedObjectsEquality.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two instances of mocked objects
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.MockedObjectsEquality.Equals(System.Object,System.Object)">
+            <summary>
+            Compare two mocked objects
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.MockedObjectsEquality.NextHashCode">
+            <summary>
+            The next hash code value for a mock object.
+            This is safe for multi threading.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.MockedObjectsEquality.Instance">
+            <summary>
+            The sole instance of <see cref="T:Rhino.Mocks.Impl.MockedObjectsEquality"/>
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.ProxyInstance">
+            <summary>
+            This is a dummy type that is used merely to give DynamicProxy the proxy instance that
+            it needs to create IProxy's types.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IMockedObject">
+            <summary>
+            Interface to find the repository of a mocked object
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.ShouldCallOriginal(System.Reflection.MethodInfo)">
+            <summary>
+            Return true if it should call the original method on the object
+            instead of pass it to the message chain.
+            </summary>
+            <param name="method">The method to call</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.RegisterMethodForCallingOriginal(System.Reflection.MethodInfo)">
+            <summary>
+            Register a method to be called on the object directly
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.RegisterPropertyBehaviorFor(System.Reflection.PropertyInfo)">
+            <summary>
+            Register a property on the object that will behave as a simple property
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.IsPropertyMethod(System.Reflection.MethodInfo)">
+            <summary>
+            Check if the method was registered as a property method.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.HandleProperty(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Do get/set on the property, according to need.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.HandleEvent(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Do add/remove on the event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.GetEventSubscribers(System.String)">
+            <summary>
+            Get the subscribers of a spesific event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.GetDeclaringType(System.Reflection.MethodInfo)">
+            <summary>
+            Gets the declaring type of the method, taking into acccount the possible generic 
+            parameters that it was created with.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.ClearState(Rhino.Mocks.BackToRecordOptions)">
+            <summary>
+            Clears the state of the object, remove original calls, property behavior, subscribed events, etc.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.GetCallArgumentsFor(System.Reflection.MethodInfo)">
+            <summary>
+            Get all the method calls arguments that were made against this object with the specificed 
+            method.
+            </summary>
+            <remarks>
+            Only method calls in replay mode are counted
+            </remarks>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMockedObject.MethodCall(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Records the method call
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockedObject.DependentMocks">
+            <summary>
+            Mocks that are tied to this mock lifestyle
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockedObject.ProxyHash">
+            <summary>
+            The unique hash code of this mock, which is not related
+            to the value of the GetHashCode() call on the object.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockedObject.Repository">
+            <summary>
+            Gets the repository.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockedObject.ImplementedTypes">
+            <summary>
+            Gets the implemented types by this mocked object
+            </summary>
+            <value>The implemented.</value>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockedObject.ConstructorArguments">
+            <summary>
+            Gets or sets the constructor arguments.
+            </summary>
+            <value>The constructor arguments.</value>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMockedObject.MockedObjectInstance">
+            <summary>
+            The mocked instance that this is representing
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.#ctor(Rhino.Mocks.MockRepository,System.Type[])">
+            <summary>
+            Create a new instance of <see cref="T:Rhino.Mocks.Impl.ProxyInstance"/>
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.ShouldCallOriginal(System.Reflection.MethodInfo)">
+            <summary>
+            Return true if it should call the original method on the object
+            instead of pass it to the message chain.
+            </summary>
+            <param name="method">The method to call</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.RegisterMethodForCallingOriginal(System.Reflection.MethodInfo)">
+            <summary>
+            Register a method to be called on the object directly
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.RegisterPropertyBehaviorFor(System.Reflection.PropertyInfo)">
+            <summary>
+            Register a property on the object that will behave as a simple property
+            Return true if there is already a value for the property
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.IsPropertyMethod(System.Reflection.MethodInfo)">
+            <summary>
+            Check if the method was registered as a property method.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.HandleProperty(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Do get/set on the property, according to need.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.HandleEvent(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Do add/remove on the event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.GetEventSubscribers(System.String)">
+            <summary>
+            Get the subscribers of a spesific event
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.GetDeclaringType(System.Reflection.MethodInfo)">
+            <summary>
+            Gets the declaring type of the method, taking into acccount the possible generic 
+            parameters that it was created with.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.GetCallArgumentsFor(System.Reflection.MethodInfo)">
+            <summary>
+            Get all the method calls arguments that were made against this object with the specificed
+            method.
+            </summary>
+            <param name="method"></param>
+            <returns></returns>
+            <remarks>
+            Only method calls in replay mode are counted
+            </remarks>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.MethodCall(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Records the method call
+            </summary>
+            <param name="method"></param>
+            <param name="args"></param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ProxyInstance.ClearState(Rhino.Mocks.BackToRecordOptions)">
+            <summary>
+            Clears the state of the object, remove original calls, property behavior, subscribed events, etc.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ProxyInstance.DependentMocks">
+            <summary>
+            Mocks that are tied to this mock lifestyle
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ProxyInstance.ProxyHash">
+            <summary>
+            The unique hash code of this proxy, which is not related
+            to the value of the GetHashCode() call on the object.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ProxyInstance.Repository">
+            <summary>
+            Gets the repository.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ProxyInstance.ConstructorArguments">
+            <summary>
+            Gets or sets the constructor arguments.
+            </summary>
+            <value>The constructor arguments.</value>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ProxyInstance.MockedObjectInstance">
+            <summary>
+            The mocked instance that this is representing
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.ProxyInstance.ImplementedTypes">
+            <summary>
+            Gets the implemented types by this mocked object
+            </summary>
+            <value>The implemented.</value>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.Range">
+            <summary>
+            Range for expected method calls
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.Range.#ctor(System.Int32,System.Nullable{System.Int32})">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.Range"/> instance.
+            </summary>
+            <param name="min">Min.</param>
+            <param name="max">Max.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.Range.ToString">
+            <summary>
+            Return the string representation of this range.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.Range.Min">
+            <summary>
+            Gets or sets the min.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.Range.Max">
+            <summary>
+            Gets or sets the max.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RecordDynamicMockState">
+            <summary>
+            Records all the expectations for a mock and
+            return a ReplayDynamicMockState when Replay()
+            is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordDynamicMockState.#ctor(Rhino.Mocks.Interfaces.IMockedObject,Rhino.Mocks.MockRepository)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.RecordDynamicMockState"/> instance.
+            </summary>
+            <param name="repository">Repository.</param>
+            <param name="mockedObject">The proxy that generates the method calls</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordDynamicMockState.DoReplay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordDynamicMockState.GetDefaultCallCountRangeExpectation">
+            <summary>
+            Get the default call count range expectation
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordDynamicMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RecordPartialMockState">
+            <summary>
+            Records all the expectations for a mock and
+            return a ReplayPartialMockState when Replay()
+            is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordPartialMockState.#ctor(Rhino.Mocks.Interfaces.IMockedObject,Rhino.Mocks.MockRepository)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.RecordDynamicMockState"/> instance.
+            </summary>
+            <param name="repository">Repository.</param>
+            <param name="mockedObject">The proxy that generates the method calls</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordPartialMockState.DoReplay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RecordPartialMockState.BackToRecord">
+            <summary>
+            Gets a mock state that matches the original mock state of the object.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RepeatableOption">
+            <summary>
+            Options for special repeat option
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.RepeatableOption.Normal">
+            <summary>
+            This method can be called only as many times as the IMethodOptions.Expect allows.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.RepeatableOption.Never">
+            <summary>
+            This method should never be called
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.RepeatableOption.Any">
+            <summary>
+            This method can be call any number of times
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.RepeatableOption.OriginalCall">
+            <summary>
+            This method will call the original method
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.RepeatableOption.OriginalCallBypassingMocking">
+            <summary>
+            This method will call the original method, bypassing the mocking layer
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.Impl.RepeatableOption.PropertyBehavior">
+            <summary>
+            This method will simulate simple property behavior
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.ReplayDynamicMockState">
+            <summary>
+            Validate all expectations on a mock and ignores calls to
+            any method that was not setup properly.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayDynamicMockState.#ctor(Rhino.Mocks.Impl.RecordDynamicMockState)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.ReplayDynamicMockState"/> instance.
+            </summary>
+            <param name="previousState">The previous state for this method</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayDynamicMockState.DoMethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayDynamicMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.ReplayPartialMockState">
+            <summary>
+            Validate all expectations on a mock and ignores calls to
+            any method that was not setup properly.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayPartialMockState.#ctor(Rhino.Mocks.Impl.RecordPartialMockState)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.ReplayDynamicMockState"/> instance.
+            </summary>
+            <param name="previousState">The previous state for this method</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayPartialMockState.DoMethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.ReplayPartialMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.RhinoInterceptor">
+            <summary>
+            Summary description for RhinoInterceptor.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RhinoInterceptor.#ctor(Rhino.Mocks.MockRepository,Rhino.Mocks.Interfaces.IMockedObject)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.Impl.RhinoInterceptor"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.RhinoInterceptor.Intercept(Castle.Core.Interceptor.IInvocation)">
+            <summary>
+            Intercept a method call and direct it to the repository.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.Validate">
+            <summary>
+            Validate arguments for methods
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.Validate.IsNotNull(System.Object,System.String)">
+            <summary>
+            Validate that the passed argument is not null.
+            </summary>
+            <param name="obj">The object to validate</param>
+            <param name="name">The name of the argument</param>
+            <exception cref="T:System.ArgumentNullException">
+            If the obj is null, an ArgumentNullException with the passed name
+            is thrown.
+            </exception>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.Validate.ArgsEqual(System.Object[],System.Object[])">
+            <summary>
+            Validate that the arguments are equal.
+            </summary>
+            <param name="expectedArgs">Expected args.</param>
+            <param name="actualArgs">Actual Args.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.Validate.AreEqual(System.Object,System.Object)">
+            <summary>
+            Validate that the two arguments are equals, including validation for
+            when the arguments are collections, in which case it will validate their values.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.Validate.SafeEquals(System.Object,System.Object)">
+            <summary>
+            This method is safe for use even if any of the objects is a mocked object
+            that override equals.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Impl.VerifiedMockState">
+            <summary>
+            Throw an object already verified when accessed
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.#ctor(Rhino.Mocks.Interfaces.IMockState)">
+            <summary>
+            Create a new instance of VerifiedMockState 
+            </summary>
+            <param name="previous">The previous mock state, used to get the initial record state</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.MethodCall(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Add a method call for this state' mock.
+            </summary>
+            <param name="invocation">The invocation for this method</param>
+            <param name="method">The method that was called</param>
+            <param name="args">The arguments this method was called with</param>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.Verify">
+            <summary>
+            Verify that this mock expectations have passed.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.Replay">
+            <summary>
+            Verify that we can move to replay state and move 
+            to the reply state.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.BackToRecord">
+            <summary>
+            Gets a mock state that match the original mock state of the object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.GetLastMethodOptions``1">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.SetExceptionToThrowOnVerify(System.Exception)">
+            <summary>
+            Set the exception to throw when Verify is called.
+            This is used to report exception that may have happened but where caught in the code.
+            This way, they are reported anyway when Verify() is called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Impl.VerifiedMockState.NotifyCallOnPropertyBehavior">
+            <summary>
+            not relevant
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.VerifiedMockState.VerifyState">
+            <summary>
+            Gets the matching verify state for this state
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Impl.VerifiedMockState.LastMethodOptions">
+            <summary>
+            Get the options for the last method call
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Interfaces.IMethodRecorder">
+            <summary>
+            Records the actions on all the mocks created by a repository.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.Record(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Records the specified call with the specified args on the mocked object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.GetRecordedExpectation(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Get the expectation for this method on this object with this arguments 
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.GetRepeatableExpectation(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            This check the methods that were setup using the SetupResult.For()
+            or LastCall.Repeat.Any() and that bypass the whole expectation model.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.GetAllExpectationsForProxyAndMethod(System.Object,System.Reflection.MethodInfo)">
+            <summary>
+            Gets the all expectations for a mocked object and method combination,
+            regardless of the expected arguments / callbacks / contraints.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <param name="method">Method.</param>
+            <returns>List of all relevant expectation</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.GetAllExpectationsForProxy(System.Object)">
+            <summary>
+            Gets the all expectations for proxy.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <returns>List of all relevant expectation</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.RemoveAllRepeatableExpectationsForProxy(System.Object)">
+            <summary>
+            Removes all the repeatable expectations for proxy.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.ReplaceExpectation(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Replaces the old expectation with the new expectation for the specified proxy/method pair.
+            This replace ALL expectations that equal to old expectations.
+            </summary>
+            <param name="proxy">Proxy.</param>
+            <param name="method">Method.</param>
+            <param name="oldExpectation">Old expectation.</param>
+            <param name="newExpectation">New expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.AddRecorder(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Adds the recorder and turn it into the active recorder.
+            </summary>
+            <param name="recorder">Recorder.</param>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.MoveToPreviousRecorder">
+            <summary>
+            Moves to previous recorder.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.GetRecordedExpectationOrNull(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Gets the recorded expectation or null.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.GetExpectedCallsMessage">
+            <summary>
+            Gets the next expected calls string.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.MoveToParentReplayer">
+            <summary>
+            Moves to parent recorder.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.AddToRepeatableMethods(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Set the expectation so it can repeat any number of times.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.RemoveExpectation(Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Removes the expectation from the recorder
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.ClearReplayerToCall(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Clear the replayer to call (and all its chain of replayers)
+            This also removes it from the list of expectations, so it will never be considered again
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Interfaces.IMethodRecorder.UnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Get the expectation for this method on this object with this arguments 
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Interfaces.IMethodRecorder.HasExpectations">
+            <summary>
+            Gets a value indicating whether this instance has expectations that weren't satisfied yet.
+            </summary>
+            <value>
+            	<c>true</c> if this instance has expectations; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Rhino.Mocks.LastCall">
+            <summary>
+            Allows to set various options for the last method call on
+            a specified object.
+            If the method has a return value, it's recommended to use Expect
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.On(System.Object)">
+            <summary>
+            Allows to get an interface to work on the last call.
+            </summary>
+            <param name="mockedInstance">The mocked object</param>
+            <returns>Interface that allows to set options for the last method call on this object</returns>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Return``1(``0)">
+            <summary>
+            Set the return value for the method.
+            </summary>
+            <param name="objToReturn">The object the method will return</param>
+            <returns>IRepeat that defines how many times the method will return this value</returns>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Return(System.Object)">
+            <summary>
+            Set the return value for the method. This overload is needed for LastCall.Return(null)
+            </summary>
+            <param name="objToReturn">The object the method will return</param>
+            <returns>IRepeat that defines how many times the method will return this value</returns>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Throw(System.Exception)">
+            <summary>
+            Throws the specified exception when the method is called.
+            </summary>
+            <param name="exception">Exception to throw</param>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.IgnoreArguments">
+            <summary>
+            Ignores the arguments for this method. Any argument will be matched
+            againt this method.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Constraints(Rhino.Mocks.Constraints.AbstractConstraint[])">
+            <summary>
+            Add constraints for the method's arguments.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback(System.Delegate)">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback(Rhino.Mocks.Delegates.Function{System.Boolean})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``1(Rhino.Mocks.Delegates.Function{System.Boolean,``0})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``2(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``3(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``4(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``5(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``6(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``7(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``8(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``9(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7,``8})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Callback``10(Rhino.Mocks.Delegates.Function{System.Boolean,``0,``1,``2,``3,``4,``5,``6,``7,``8,``9})">
+            <summary>
+            Set a callback method for the last call
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.CallOriginalMethod">
+            <summary>
+            Call the original method on the class, bypassing the mocking layers, for the last call.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.CallOriginalMethod(Rhino.Mocks.Interfaces.OriginalCallOptions)">
+            <summary>
+            Call the original method on the class, optionally bypassing the mocking layers, for the last call.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Do(System.Delegate)">
+            <summary>
+            Set a delegate to be called when the expectation is matched.
+            The delegate return value will be returned from the expectation.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.GetEventRaiser">
+            <summary>
+            Gets an interface that will raise the last event when called.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.OutRef(System.Object[])">
+            <summary>
+            Set the parameter values for out and ref parameters.
+            This is done using zero based indexing, and _ignoring_ any non out/ref parameter.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.Message(System.String)">
+            <summary>
+            Documentation message for the expectation
+            </summary>
+            <param name="documentationMessage">Message</param>
+        </member>
+        <member name="M:Rhino.Mocks.LastCall.PropertyBehavior">
+            <summary>
+            Use the property as a simple property, getting/setting the values without
+            causing mock expectations.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.LastCall.Repeat">
+            <summary>
+            Better syntax to define repeats. 
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.MethodRecorders.MethodRecorderBase">
+            <summary>
+            Base class for method recorders, handle delegating to inner recorder if needed.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.recordedActions">
+            <summary>
+            List of the expected actions on for this recorder
+            The legal values are:
+            	* Expectations
+            	* Method Recorders
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.recorderToCall">
+            <summary>
+            The current recorder.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.replayerToCall">
+            <summary>
+            The current replayer;
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.parentRecorder">
+            <summary>
+            The parent recorder of this one, may be null.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.replayersToIgnoreForThisCall">
+            <summary>
+            This contains a list of all the replayers that should be ignored
+            for a spesific method call. A replayer gets into this list by calling 
+            ClearReplayerToCall() on its parent. This list is Clear()ed on each new invocation.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.repeatableMethods">
+            <summary>
+            All the repeatable methods calls.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.MethodRecorderBase.recursionDepth">
+            <summary>
+            Counts the recursion depth of the current expectation search stack
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.#ctor(Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.MethodRecorderBase"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.#ctor(Rhino.Mocks.Interfaces.IMethodRecorder,Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.MethodRecorderBase"/> instance.
+            </summary>
+            <param name="parentRecorder">Parent recorder.</param>
+            <param name="repeatableMethods">Repeatable methods</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.Record(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Records the specified call with the specified args on the mocked object.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetRecordedExpectation(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Get the expectation for this method on this object with this arguments 
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetAllExpectationsForProxyAndMethod(System.Object,System.Reflection.MethodInfo)">
+            <summary>
+            Gets the all expectations for a mocked object and method combination,
+            regardless of the expected arguments / callbacks / contraints.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <param name="method">Method.</param>
+            <returns>List of all relevant expectation</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetAllExpectationsForProxy(System.Object)">
+            <summary>
+            Gets the all expectations for proxy.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <returns>List of all relevant expectation</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.ReplaceExpectation(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Replaces the old expectation with the new expectation for the specified proxy/method pair.
+            This replace ALL expectations that equal to old expectations.
+            </summary>
+            <param name="proxy">Proxy.</param>
+            <param name="method">Method.</param>
+            <param name="oldExpectation">Old expectation.</param>
+            <param name="newExpectation">New expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.RemoveAllRepeatableExpectationsForProxy(System.Object)">
+            <summary>
+            Remove the all repeatable expectations for proxy.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.AddToRepeatableMethods(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Set the expectation so it can repeat any number of times.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.RemoveExpectation(Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Removes the expectation from the recorder
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.AddRecorder(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Adds the recorder and turn it into the active recorder.
+            </summary>
+            <param name="recorder">Recorder.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.MoveToPreviousRecorder">
+            <summary>
+            Moves to previous recorder.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.MoveToParentReplayer">
+            <summary>
+            Moves to parent recorder.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetRecordedExpectationOrNull(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Gets the recorded expectation or null.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.ClearReplayerToCall(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Clear the replayer to call (and all its chain of replayers).
+            This also removes it from the list of expectations, so it will never be considered again
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.UnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Get the expectation for this method on this object with this arguments 
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetExpectedCallsMessage">
+            <summary>
+            Gets the next expected calls string.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoGetRecordedExpectationOrNull(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Handles the real getting of the recorded expectation or null.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoRecord(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoGetRecordedExpectation(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoGetAllExpectationsForProxy(System.Object)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoReplaceExpectation(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoRemoveExpectation(Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoAddRecorder(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.ShouldConsiderThisReplayer(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Should this replayer be considered valid for this call?
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetRepeatableExpectation(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            This check the methods that were setup using the SetupResult.For()
+            or LastCall.Repeat.Any() and that bypass the whole expectation model.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.MethodRecorderBase.HasExpectations">
+            <summary>
+            Gets a value indicating whether this instance has expectations that weren't satisfied yet.
+            </summary>
+            <value>
+            	<c>true</c> if this instance has expectations; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.MethodRecorderBase.DoHasExpectations">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder">
+            <summary>
+            Ordered collection of methods, methods must arrive in specified order
+            in order to pass.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder">
+            <summary>
+            Unordered collection of method records, any expectation that exist
+            will be matched.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.parentRecorderRedirection">
+            <summary>
+            The parent recorder we have redirected to.
+            Useful for certain edge cases in orderring.
+            See: FieldProblem_Entropy for the details.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.#ctor(Rhino.Mocks.Interfaces.IMethodRecorder,Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder"/> instance.
+            </summary>
+            <param name="parentRecorder">Parent recorder.</param>
+            <param name="repeatableMethods">Repeatable methods</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.#ctor(Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoRecord(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Records the specified call with the specified args on the mocked object.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <param name="method">Method.</param>
+            <param name="expectation">Expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoGetRecordedExpectation(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Get the expectation for this method on this object with this arguments 
+            </summary>
+            <param name="invocation">Invocation for this method</param>
+            <param name="proxy">Mocked object.</param>
+            <param name="method">Method.</param>
+            <param name="args">Args.</param>
+            <returns>True is the call was recorded, false otherwise</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.GetAllExpectationsForProxyAndMethod(System.Object,System.Reflection.MethodInfo)">
+            <summary>
+            Gets the all expectations for a mocked object and method combination,
+            regardless of the expected arguments / callbacks / contraints.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <param name="method">Method.</param>
+            <returns>List of all relevant expectation</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoGetAllExpectationsForProxy(System.Object)">
+            <summary>
+            Gets the all expectations for proxy.
+            </summary>
+            <param name="proxy">Mocked object.</param>
+            <returns>List of all relevant expectation</returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoReplaceExpectation(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Replaces the old expectation with the new expectation for the specified proxy/method pair.
+            This replace ALL expectations that equal to old expectations.
+            </summary>
+            <param name="proxy">Proxy.</param>
+            <param name="method">Method.</param>
+            <param name="oldExpectation">Old expectation.</param>
+            <param name="newExpectation">New expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoRemoveExpectation(Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoGetRecordedExpectationOrNull(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Handles the real getting of the recorded expectation or null.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoAddRecorder(Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Handle the real execution of this method for the derived class
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.GetExpectedCallsMessage">
+            <summary>
+            Gets the next expected calls string.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.UnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Create an exception for an unexpected method call.
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoHasExpectations">
+            <summary>
+            Gets a value indicating whether this instance has expectations that weren't satisfied yet.
+            </summary>
+            <value>
+            	<c>true</c> if this instance has expectations; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder.#ctor(Rhino.Mocks.Interfaces.IMethodRecorder,Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder"/> instance.
+            </summary>
+            <param name="parentRecorder">Parent recorder.</param>
+            <param name="repeatableMethods">Repetable methods</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder.#ctor(Rhino.Mocks.Generated.ProxyMethodExpectationsDictionary)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder.DoGetRecordedExpectationOrNull(System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Handles the real getting of the recorded expectation or null.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder.UnexpectedMethodCall(Castle.Core.Interceptor.IInvocation,System.Object,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Get the expectation for this method on this object with this arguments 
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.OrderedMethodRecorder.GetExpectedCallsMessage">
+            <summary>
+            Gets the next expected calls string.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet">
+            <summary>
+            Hold an expectation for a method call on an object
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet.#ctor(System.Object,System.Reflection.MethodInfo,Rhino.Mocks.Interfaces.IExpectation)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet"/> instance.
+            </summary>
+            <param name="proxy">Proxy.</param>
+            <param name="method">Method.</param>
+            <param name="expectation">Expectation.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet.Equals(System.Object)">
+            <summary>
+            Determines if the object equal to this instance
+            </summary>
+            <param name="obj">Obj.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet.GetHashCode">
+            <summary>
+            Gets the hash code.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet.Proxy">
+            <summary>
+            Gets the proxy.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet.Method">
+            <summary>
+            Gets the method.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.ProxyMethodExpectationTriplet.Expectation">
+            <summary>
+            Gets the expectation.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.MethodRecorders.ProxyMethodPair">
+            <summary>
+            Holds a pair of mocked object and a method
+            and allows to compare them against each other.
+            This allows us to have a distinction between mockOne.MyMethod() and
+            mockTwo.MyMethod()...
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.ProxyMethodPair.#ctor(System.Object,System.Reflection.MethodInfo)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.ProxyMethodPair"/> instance.
+            </summary>
+            <param name="proxy">Proxy.</param>
+            <param name="method">Method.</param>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.ProxyMethodPair.Equals(System.Object)">
+            <summary>
+            Determines whatever obj equals to this instance.
+            ProxyMethodPairs are equal when they point to the same /instance/ of
+            an object, and to the same method.
+            </summary>
+            <param name="obj">Obj.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.ProxyMethodPair.GetHashCode">
+            <summary>
+            Gets the hash code.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.ProxyMethodPair.Proxy">
+            <summary>
+            Gets the proxy.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Rhino.Mocks.MethodRecorders.ProxyMethodPair.Method">
+            <summary>
+            Gets the method.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Rhino.Mocks.MethodRecorders.RecorderChanger">
+            <summary>
+            Change the recorder from ordered to unordered and vice versa
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.RecorderChanger.#ctor(Rhino.Mocks.MockRepository,Rhino.Mocks.Interfaces.IMethodRecorder,Rhino.Mocks.Interfaces.IMethodRecorder)">
+            <summary>
+            Creates a new <see cref="T:Rhino.Mocks.MethodRecorders.RecorderChanger"/> instance.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.MethodRecorders.RecorderChanger.Dispose">
+            <summary>
+            Disposes this instance.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Mocker">
+            <summary>
+            Accessor for the current mocker
+            </summary>
+        </member>
+        <member name="P:Rhino.Mocks.Mocker.Current">
+            <summary>
+            The current mocker
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.RhinoMocks">
+            <summary>
+            Used for [assembly: InternalsVisibleTo(RhinoMocks.StrongName)]
+            Used for [assembly: InternalsVisibleTo(RhinoMocks.NormalName)]
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.RhinoMocks.StrongName">
+            <summary>
+            Strong name for the Dynamic Proxy assemblies. Used for InternalsVisibleTo specification.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.RhinoMocks.NormalName">
+            <summary>
+            Normal name for dynamic proxy assemblies. Used for InternalsVisibleTo specification.
+            </summary>
+        </member>
+        <member name="F:Rhino.Mocks.RhinoMocks.Logger">
+            <summary>
+            Logs all method calls for methods
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.SetupResult">
+            <summary>
+            Setup method calls to repeat any number of times.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.SetupResult.For``1(``0)">
+            <summary>
+            Get the method options and set the last method call to repeat 
+            any number of times.
+            This also means that the method would transcend ordering
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.SetupResult.On(System.Object)">
+            <summary>
+            Get the method options for the last method call on the mockInstance and set it
+            to repeat any number of times.
+            This also means that the method would transcend ordering
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Utilities.MethodCallUtil">
+            <summary>
+            Utility class for working with method calls.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Utilities.MethodCallUtil.StringPresentation(Castle.Core.Interceptor.IInvocation,Rhino.Mocks.Utilities.MethodCallUtil.FormatArgumnet,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Return the string representation of a method call and its arguments.
+            </summary>
+            <param name="method">The method</param>
+            <param name="args">The method arguments</param>
+            <param name="invocation">Invocation of the method, used to get the generics arguments</param>
+            <param name="format">Delegate to format the parameter</param>
+            <returns>The string representation of this method call</returns>
+        </member>
+        <member name="M:Rhino.Mocks.Utilities.MethodCallUtil.StringPresentation(Castle.Core.Interceptor.IInvocation,System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+            Return the string representation of a method call and its arguments.
+            </summary>
+            <param name="invocation">The invocation of the method, used to get the generic parameters</param>
+            <param name="method">The method</param>
+            <param name="args">The method arguments</param>
+            <returns>The string representation of this method call</returns>
+        </member>
+        <member name="T:Rhino.Mocks.Utilities.MethodCallUtil.FormatArgumnet">
+            <summary>
+            Delegate to format the argument for the string representation of
+            the method call.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Utilities.ReturnValueUtil">
+            <summary>
+            Utility to get the default value for a type
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.Utilities.ReturnValueUtil.DefaultValue(System.Type,Castle.Core.Interceptor.IInvocation)">
+            <summary>
+            The default value for a type.
+            Null for reference types and void
+            0 for value types.
+            First element for enums
+            Note that we need to get the value even for opened generic types, such as those from
+            generic methods.
+            </summary>
+            <param name="type">Type.</param>
+            <param name="invocation">The invocation.</param>
+            <returns>the default value</returns>
+        </member>
+        <member name="T:Rhino.Mocks.With">
+            <summary>
+            Allows easier access to MockRepository, works closely with Mocker.Current to
+            allow access to a context where the mock repository is automatially verified at
+            the end of the code block.
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.With.Mocks(Rhino.Mocks.With.Proc)">
+            <summary>
+            Initialize a code block where Mocker.Current is initialized.
+            At the end of the code block, all the expectation will be verified.
+            This overload will create a new MockRepository.
+            </summary>
+            <param name="methodCallThatHasMocks">The code that will be executed under the mock context</param>
+        </member>
+        <member name="M:Rhino.Mocks.With.Mocks(Rhino.Mocks.MockRepository,Rhino.Mocks.With.Proc)">
+            <summary>
+            Initialize a code block where Mocker.Current is initialized.
+            At the end of the code block, all the expectation will be verified.
+            This overload will create a new MockRepository.
+            </summary>
+            <param name="mocks">The mock repository to use, at the end of the code block, VerifyAll() will be called on the repository.</param>
+            <param name="methodCallThatHasMocks">The code that will be executed under the mock context</param>
+        </member>
+        <member name="M:Rhino.Mocks.With.Mocks(Rhino.Mocks.MockRepository)">
+            <summary>
+            Create a FluentMocker
+            </summary>
+            <param name="mocks">The mock repository to use.</param>
+        </member>
+        <member name="T:Rhino.Mocks.With.Proc">
+            <summary>
+            A method with no arguments and no return value that will be called under the mock context.
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.With.FluentMocker">
+            <summary>
+            FluentMocker implements some kind of fluent interface attempt
+            for saying "With the Mocks [mocks], Expecting (in same order) [things] verify [that]."
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.With.IMockVerifier">
+            <summary>
+            Interface to verify previously defined expectations
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.With.IMockVerifier.Verify(Rhino.Mocks.With.Proc)">
+            <summary>
+            Verifies if a piece of code
+            </summary>
+        </member>
+        <member name="M:Rhino.Mocks.With.FluentMocker.Expecting(Rhino.Mocks.With.Proc)">
+            <summary>
+            Defines unordered expectations
+            </summary>
+            <param name="methodCallsDescribingExpectations">A delegate describing the expectations</param>
+            <returns>an IMockVerifier</returns>
+        </member>
+        <member name="M:Rhino.Mocks.With.FluentMocker.ExpectingInSameOrder(Rhino.Mocks.With.Proc)">
+            <summary>
+            Defines ordered expectations
+            </summary>
+            <param name="methodCallsDescribingExpectations">A delegate describing the expectations</param>
+            <returns>an IMockVerifier</returns>
+        </member>
+        <member name="M:Rhino.Mocks.With.FluentMocker.Verify(Rhino.Mocks.With.Proc)">
+            <summary>
+            Verifies previously defined expectations
+            </summary>
+        </member>
+        <member name="T:Rhino.Mocks.Function`2">
+            <summary>
+            This delegate is compatible with the System.Func{T,R} signature
+            We have to define our own to get compatability with 2.0
+            </summary>
+        </member>
+        <member name="T:__ProtectAttribute">
+            <summary>
+            This attribute is here so we can get better Pex integration
+            Using this means that Pex will not try to inspect the work of 
+            the actual proxies being generated by Rhino Mocks
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/license.rtf b/license.rtf
index b97b9cd..1a5b516 100644
Binary files a/license.rtf and b/license.rtf differ
diff --git a/license.txt b/license.txt
index ab91df4..724e465 100644
--- a/license.txt
+++ b/license.txt
@@ -1,4 +1,4 @@
-Copyright © 2002-2008 Charlie Poole
+Copyright © 2002-2012 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-2008 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-2012 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
deleted file mode 100644
index 013bfb6..0000000
--- a/nunit.build
+++ /dev/null
@@ -1,1141 +0,0 @@
-<?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
deleted file mode 100644
index fc521d2..0000000
--- a/nunit.build.include
+++ /dev/null
@@ -1,405 +0,0 @@
-<?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
index 7e1d9f3..2966d68 100644
--- a/nunit.sln
+++ b/nunit.sln
@@ -3,78 +3,100 @@ 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}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scripts", "Scripts", "{A785FC02-6044-4864-BE24-4593CAD23A97}"
+	ProjectSection(SolutionItems) = preProject
+		scripts\nunit.build.targets = scripts\nunit.build.targets
+		scripts\nunit.common.targets = scripts\nunit.common.targets
+	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "src\GuiRunner\nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitFramework", "NUnitFramework", "{A2FF9F1B-1854-479A-859C-6ECEBF045E4C}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks", "src\NUnitMocks\mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
+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.uikit.dll", "src\GuiComponents\UiKit\nunit.uikit.dll.csproj", "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "src\NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClientUtilities", "ClientUtilities", "{D448BA20-BA70-4F70-AF53-4C0E6C1E97E7}"
+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.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}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConsoleRunner", "ConsoleRunner", "{1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks.tests", "src\NUnitMocks\tests\nunit.mocks.tests.csproj", "{8667C588-1A05-4773-A9E8-272EB302B8AB}"
+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.uikit.tests", "src\GuiComponents\tests\nunit.uikit.tests.csproj", "{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}"
+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-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}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiRunner", "GuiRunner", "{77D10207-CB02-4C3A-8734-5A5173E3C506}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests", "src\NUnitFramework\tests\nunit.framework.tests.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
+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-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}"
+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.core.dll", "src\NUnitCore\core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitCore", "NUnitCore", "{AEAED2BD-F22D-42C8-9047-F293BEF70EAB}"
 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}") = "nunit.core.dll", "src\NUnitCore\core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiComponents", "GuiComponents", "{168F8C38-129C-454A-B112-F456BC7F4FE4}"
+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.uikit.dll", "src\GuiComponents\UiKit\nunit.uikit.dll.csproj", "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiException", "GuiException", "{35A92AA3-A1E6-426E-8D96-322F3EBF1C8D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uiexception.tests", "src\GuiException\tests\nunit.uiexception.tests.csproj", "{092486D0-6AB9-4134-932F-0FDA10704455}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uiexception.dll", "src\GuiException\UiException\nunit.uiexception.dll.csproj", "{3E87A106-EB20-4147-84C8-95B0BB43A1D4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6142B985-EA14-4DE0-884F-E62D89949E1D}"
+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}"
+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-console", "src\ConsoleRunner\nunit-console\nunit-console.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitMocks", "NUnitMocks", "{7740410A-54B5-4334-8DE3-6D6F616BD6A5}"
+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.fixtures", "src\NUnitFixtures\fixtures\nunit.fixtures.csproj", "{A8D36198-BE2F-44E5-AC4F-4E052AFCCF78}"
+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.fixtures.tests", "src\NUnitFixtures\tests\nunit.fixtures.tests.csproj", "{55F2D231-743C-48DD-B79A-00E5A7236CBE}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PNUnit", "PNUnit", "{979724B8-6FAA-400F-B40D-EB653A815C87}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-agent.exe", "src\NUnitTestServer\nunit-agent-exe\nunit-agent.exe.csproj", "{3E469CD9-FED2-4955-AE4C-669A74CA6767}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit-agent", "src\PNUnit\agent\pnunit-agent.csproj", "{621C27DA-CC29-4663-9FE4-BF5A67970C18}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loadtest-assembly", "src\tests\loadtest-assembly\loadtest-assembly.csproj", "{20ABDB3C-EA46-468A-A574-0552299A32DB}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit-launcher", "src\PNUnit\launcher\pnunit-launcher.csproj", "{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.framework", "src\PNUnit\pnunit.framework\pnunit.framework.csproj", "{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}"
+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}") = "pnunit-agent", "src\PNUnit\agent\pnunit-agent.csproj", "{7521B6A2-35C2-4BD4-9304-29FB186638F2}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.framework", "src\PNUnit\pnunit.framework\pnunit.framework.csproj", "{5261ABA1-98E6-4603-A4F0-59CAC307AC68}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit-launcher", "src\PNUnit\launcher\pnunit-launcher.csproj", "{5E0C72D1-A2A5-4836-BB97-57FF91055B64}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitTestServer", "NUnitTestServer", "{D029F8FD-84E3-4AD3-8F1B-CCA0C856E659}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.tests", "src\PNUnit\tests\pnunit.tests.csproj", "{319B9238-76BE-4335-9B4D-F8E43C4B124F}"
+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}") = "nunit.uiexception.dll", "src\GuiException\UiException\nunit.uiexception.dll.csproj", "{3E87A106-EB20-4147-84C8-95B0BB43A1D4}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProjectEditor", "ProjectEditor", "{992367F7-9154-4424-B55E-3EF8673A2A36}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uiexception.tests", "src\GuiException\tests\nunit.uiexception.tests.csproj", "{092486D0-6AB9-4134-932F-0FDA10704455}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-editor", "src\ProjectEditor\editor\nunit-editor.csproj", "{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-editor.tests", "src\ProjectEditor\tests\nunit-editor.tests.csproj", "{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -82,145 +104,164 @@ Global
 		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
+		{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
 		{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
+		{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
+		{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
 		{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
+		{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
+		{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
 		{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
+		{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
 		{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
+		{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
 		{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
+		{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
+		{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
+		{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
+		{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
+		{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
+		{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
+		{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
+		{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
+		{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
 		{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
+		{621C27DA-CC29-4663-9FE4-BF5A67970C18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{621C27DA-CC29-4663-9FE4-BF5A67970C18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{621C27DA-CC29-4663-9FE4-BF5A67970C18}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{621C27DA-CC29-4663-9FE4-BF5A67970C18}.Release|Any CPU.Build.0 = Release|Any CPU
+		{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}.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
+		{5261ABA1-98E6-4603-A4F0-59CAC307AC68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5261ABA1-98E6-4603-A4F0-59CAC307AC68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5261ABA1-98E6-4603-A4F0-59CAC307AC68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5261ABA1-98E6-4603-A4F0-59CAC307AC68}.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
+		{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
+		{A785FC02-6044-4864-BE24-4593CAD23A97} = {A65042E1-D8BC-48DD-8DE1-F0991F07EA77}
+		{8C326431-AE57-4645-ACC1-A90A0B425129} = {A2FF9F1B-1854-479A-859C-6ECEBF045E4C}
+		{83DD7E12-A705-4DBA-9D71-09C8973D9382} = {A2FF9F1B-1854-479A-859C-6ECEBF045E4C}
+		{74EF7165-117E-48ED-98EA-068EAE438E53} = {D448BA20-BA70-4F70-AF53-4C0E6C1E97E7}
+		{61CE9CE5-943E-44D4-A381-814DC1406767} = {D448BA20-BA70-4F70-AF53-4C0E6C1E97E7}
+		{8597D2C6-804D-48CB-BFC7-ED2404D389B0} = {1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}
+		{9367EC89-6A38-42BA-9607-0DC288E4BC3A} = {1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}
+		{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E} = {1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}
+		{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} = {77D10207-CB02-4C3A-8734-5A5173E3C506}
+		{AAD27267-DE1F-4F61-A1FB-D1680A5B8001} = {77D10207-CB02-4C3A-8734-5A5173E3C506}
+		{AAB186A4-FA3D-404D-AD78-7EB5BB861655} = {77D10207-CB02-4C3A-8734-5A5173E3C506}
+		{DD758D21-E5D5-4D40-9450-5F65A32F359C} = {AEAED2BD-F22D-42C8-9047-F293BEF70EAB}
+		{435428F8-5995-4CE4-8022-93D595A8CC0F} = {AEAED2BD-F22D-42C8-9047-F293BEF70EAB}
+		{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3} = {AEAED2BD-F22D-42C8-9047-F293BEF70EAB}
+		{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B} = {168F8C38-129C-454A-B112-F456BC7F4FE4}
+		{27531BBF-183D-4C3A-935B-D840B9F1A3A4} = {168F8C38-129C-454A-B112-F456BC7F4FE4}
+		{092486D0-6AB9-4134-932F-0FDA10704455} = {35A92AA3-A1E6-426E-8D96-322F3EBF1C8D}
+		{3E87A106-EB20-4147-84C8-95B0BB43A1D4} = {35A92AA3-A1E6-426E-8D96-322F3EBF1C8D}
+		{2E368281-3BA8-4050-B05E-0E0E43F8F446} = {6142B985-EA14-4DE0-884F-E62D89949E1D}
+		{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D} = {6142B985-EA14-4DE0-884F-E62D89949E1D}
+		{3E63AD0F-24D4-46BE-BEE4-5A3299847D86} = {6142B985-EA14-4DE0-884F-E62D89949E1D}
+		{1960CAC4-9A82-47C5-A9B3-55BC37572C3C} = {6142B985-EA14-4DE0-884F-E62D89949E1D}
+		{8667C588-1A05-4773-A9E8-272EB302B8AB} = {7740410A-54B5-4334-8DE3-6D6F616BD6A5}
+		{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C} = {7740410A-54B5-4334-8DE3-6D6F616BD6A5}
+		{621C27DA-CC29-4663-9FE4-BF5A67970C18} = {979724B8-6FAA-400F-B40D-EB653A815C87}
+		{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2} = {979724B8-6FAA-400F-B40D-EB653A815C87}
+		{319B9238-76BE-4335-9B4D-F8E43C4B124F} = {979724B8-6FAA-400F-B40D-EB653A815C87}
+		{5261ABA1-98E6-4603-A4F0-59CAC307AC68} = {979724B8-6FAA-400F-B40D-EB653A815C87}
+		{3E469CD9-FED2-4955-AE4C-669A74CA6767} = {D029F8FD-84E3-4AD3-8F1B-CCA0C856E659}
+		{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB} = {992367F7-9154-4424-B55E-3EF8673A2A36}
+		{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE} = {992367F7-9154-4424-B55E-3EF8673A2A36}
 	EndGlobalSection
 	GlobalSection(MonoDevelopProperties) = preSolution
-		StartupItem = src\GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
+		StartupItem = src\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj
 	EndGlobalSection
 EndGlobal
diff --git a/samples/samples.common b/samples/samples.common
index 20cb16d..27f743d 100644
--- a/samples/samples.common
+++ b/samples/samples.common
@@ -40,10 +40,13 @@
 
   <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}" />
+
+  <if test="${not property::exists('build.config')}">
+    <property name="build.config" value="Debug"
+              if="${build.debug}" />
+    <property name="build.config" value="Release"
+              unless="${build.debug}" />
+  </if>
 
 
   <target name="clean" description="Remove files created by build">
diff --git a/src/ClientUtilities/tests/AssemblyWatcherTests.cs b/src/ClientUtilities/tests/AssemblyWatcherTests.cs
new file mode 100644
index 0000000..bd4a5a0
--- /dev/null
+++ b/src/ClientUtilities/tests/AssemblyWatcherTests.cs
@@ -0,0 +1,133 @@
+// ****************************************************************
+// 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 NUnit.Framework;
+using System.Text;
+using System.Timers;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    [Platform(Exclude = "Win95,Win98,WinMe")]
+    public class AssemblyWatcherTests
+    {
+        private AssemblyWatcher watcher;
+        private CounterEventHandler handler;
+        private static int watcherDelayMs = 100;
+        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();
+            watcher.Setup(watcherDelayMs, fileName);
+            watcher.AssemblyChanged += new AssemblyChangedHandler(handler.OnChanged);
+            watcher.Start();
+        }
+
+        [TearDown]
+        public void DeleteFile()
+        {
+            watcher.Stop();
+            FileInfo fileInfo = new FileInfo(fileName);
+            fileInfo.Delete();
+
+            FileInfo temp = new FileInfo(tempFileName);
+            if (temp.Exists) temp.Delete();
+        }
+
+        [Test]
+        // TODO: Exclusion should really only apply to Mono on Windows
+        [Platform(Exclude = "Mono")]
+        public void MultipleCloselySpacedChangesTriggerWatcherOnlyOnce()
+        {
+            for (int i = 0; i < 3; i++)
+            {
+                StreamWriter writer = new StreamWriter(fileName, true);
+                writer.WriteLine("Data");
+                writer.Close();
+                System.Threading.Thread.Sleep(20);
+            }
+            WaitForTimerExpiration();
+            Assert.AreEqual(1, handler.Counter);
+            Assert.AreEqual(Path.GetFullPath(fileName), handler.FileName);
+        }
+
+        [Test]
+        // TODO: Exclusion should really only apply to Mono on Windows
+        [Platform(Exclude = "Mono")]
+        public void ChangingFileTriggersWatcher()
+        {
+            StreamWriter writer = new StreamWriter(fileName);
+            writer.Write("Goodbye");
+            writer.Close();
+
+            WaitForTimerExpiration();
+            Assert.AreEqual(1, handler.Counter);
+            Assert.AreEqual(Path.GetFullPath(fileName), handler.FileName);
+        }
+
+        [Test]
+        [Platform(Exclude = "Linux", Reason = "Attribute change triggers watcher")]
+        public void ChangingAttributesDoesNotTriggerWatcher()
+        {
+            FileInfo fi = new FileInfo(fileName);
+            FileAttributes attr = fi.Attributes;
+            fi.Attributes = FileAttributes.Hidden | attr;
+
+            WaitForTimerExpiration();
+            Assert.AreEqual(0, handler.Counter);
+        }
+
+        [Test]
+        public void CopyingFileDoesNotTriggerWatcher()
+        {
+            FileInfo fi = new FileInfo(fileName);
+            fi.CopyTo(tempFileName);
+            fi.Delete();
+
+            WaitForTimerExpiration();
+            Assert.AreEqual(0, handler.Counter);
+        }
+
+        private static void WaitForTimerExpiration()
+        {
+            System.Threading.Thread.Sleep(watcherDelayMs * 2);
+        }
+
+        private class CounterEventHandler
+        {
+            int counter;
+            String fileName;
+            public int Counter
+            {
+                get { return counter; }
+            }
+            public String FileName
+            {
+                get { return fileName; }
+            }
+
+            public void OnChanged(String fullPath)
+            {
+                fileName = fullPath;
+                counter++;
+            }
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/DomainManagerTests.cs b/src/ClientUtilities/tests/DomainManagerTests.cs
index d20c1e4..fb7fe3f 100644
--- a/src/ClientUtilities/tests/DomainManagerTests.cs
+++ b/src/ClientUtilities/tests/DomainManagerTests.cs
@@ -1,4 +1,9 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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;
 using NUnit.Framework;
@@ -72,9 +77,9 @@ namespace NUnit.Util.Tests
         }
 
         /// <summary>
-        /// Take a valid Linux path and make a valid windows path out of it
+        /// Take a valid Linux filePath and make a valid windows filePath 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.
+        /// filePath starts with a slash, add C: in front of it.
         /// </summary>
         private static string TestPath(string path)
         {
diff --git a/src/ClientUtilities/tests/FileWatcherTest.cs b/src/ClientUtilities/tests/FileWatcherTest.cs
deleted file mode 100644
index ed5f82b..0000000
--- a/src/ClientUtilities/tests/FileWatcherTest.cs
+++ /dev/null
@@ -1,134 +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.
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Framework;
-using System.Text;
-using System.Timers;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	[Platform( Exclude = "Win95,Win98,WinMe" )]
-	public class FileWatcherTest
-	{
-		private AssemblyWatcher watcher;
-		private CounterEventHandler handler;
-		private static int watcherDelayMs = 100;
-		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();
-			watcher.Setup(watcherDelayMs, fileName);
-			watcher.AssemblyChanged += new AssemblyChangedHandler( handler.OnChanged );
-			watcher.Start();
-		}
-
-		[TearDown]
-		public void DeleteFile()
-		{
-			watcher.Stop();
-			FileInfo fileInfo = new FileInfo(fileName);
-			fileInfo.Delete();
-
-			FileInfo temp = new FileInfo(tempFileName);
-			if(temp.Exists) temp.Delete();
-		}
-
-		[Test]
-        // TODO: Exclusion should really only apply to Mono on Windows
-        [Platform(Exclude = "Mono")]
-        public void MultipleCloselySpacedChangesTriggerWatcherOnlyOnce()
-		{
-			for(int i=0; i<3; i++)
-			{
-				StreamWriter writer = new StreamWriter( fileName, true );
-				writer.WriteLine("Data");
-				writer.Close();
-				System.Threading.Thread.Sleep(20);
-			}
-			WaitForTimerExpiration();
-			Assert.AreEqual(1,handler.Counter);
-			Assert.AreEqual(Path.GetFullPath( fileName ), handler.FileName );
-		}
-
-		[Test]
-        // TODO: Exclusion should really only apply to Mono on Windows
-        [Platform(Exclude = "Mono")]
-        public void ChangingFileTriggersWatcher()
-		{
-			StreamWriter writer = new StreamWriter( fileName );
-			writer.Write( "Goodbye" );
-			writer.Close();
-
-			WaitForTimerExpiration();
-			Assert.AreEqual( 1, handler.Counter );
-			Assert.AreEqual( Path.GetFullPath( fileName ), handler.FileName );
-		}
-
-		[Test]
-		[Platform( Exclude = "Linux", Reason = "Attribute change triggers watcher" )]	
-		public void ChangingAttributesDoesNotTriggerWatcher()
-		{
-			FileInfo fi = new FileInfo(fileName);
-			FileAttributes attr = fi.Attributes;
-			fi.Attributes = FileAttributes.Hidden | attr;
-
-			WaitForTimerExpiration();
-			Assert.AreEqual(0, handler.Counter);
-		}
-
-		[Test]
-		public void CopyingFileDoesNotTriggerWatcher()
-		{
-			FileInfo fi = new FileInfo(fileName);
-			fi.CopyTo(tempFileName);
-			fi.Delete();
-
-			WaitForTimerExpiration();
-			Assert.AreEqual(0, handler.Counter);
-		}
-
-		private static void WaitForTimerExpiration()
-		{
-			System.Threading.Thread.Sleep(watcherDelayMs * 2);
-		}
-
-	}
-
-	class CounterEventHandler
-	{
-		int counter;
-		String fileName;
-		public int Counter
-		{
-			get{ return counter;}
-		}
-		public String FileName
-		{
-			get{ return fileName;}
-		}
-
-		public void OnChanged(String fullPath)
-		{
-			fileName = fullPath;
-			counter++;
-		}
-	}
-}
diff --git a/src/ClientUtilities/tests/FileWatcherTests.cs b/src/ClientUtilities/tests/FileWatcherTests.cs
new file mode 100644
index 0000000..a067c07
--- /dev/null
+++ b/src/ClientUtilities/tests/FileWatcherTests.cs
@@ -0,0 +1,130 @@
+// ****************************************************************
+// 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.IO;
+using NUnit.Framework;
+using System.Text;
+using System.Timers;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    [Platform(Exclude = "Win95,Win98,WinMe")]
+    public class FileWatcherTests
+    {
+        private FileWatcher watcher;
+        private CounterEventHandler handler;
+        private static int watcherDelayMs = 100;
+        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 FileWatcher(fileName, watcherDelayMs);
+            watcher.Changed += new FileChangedHandler(handler.OnChanged);
+            watcher.Start();
+        }
+
+        [TearDown]
+        public void DeleteFile()
+        {
+            watcher.Stop();
+            FileInfo fileInfo = new FileInfo(fileName);
+            fileInfo.Delete();
+
+            FileInfo temp = new FileInfo(tempFileName);
+            if (temp.Exists) temp.Delete();
+        }
+
+        [Test]
+        [Platform("Linux, Net", Reason="Fails under Mono on Windows")]
+        public void MultipleCloselySpacedChangesTriggerWatcherOnlyOnce()
+        {
+            for (int i = 0; i < 3; i++)
+            {
+                StreamWriter writer = new StreamWriter(fileName, true);
+                writer.WriteLine("Data");
+                writer.Close();
+                System.Threading.Thread.Sleep(20);
+            }
+            WaitForTimerExpiration();
+            Assert.AreEqual(1, handler.Counter);
+            Assert.AreEqual(Path.GetFullPath(fileName), handler.FileName);
+        }
+
+        [Test]
+        [Platform("Linux, Net", Reason="Fails under Mono on Windows")]
+        public void ChangingFileTriggersWatcher()
+        {
+            StreamWriter writer = new StreamWriter(fileName);
+            writer.Write("Goodbye");
+            writer.Close();
+
+            WaitForTimerExpiration();
+            Assert.AreEqual(1, handler.Counter);
+            Assert.AreEqual(Path.GetFullPath(fileName), handler.FileName);
+        }
+
+        [Test]
+        [Platform(Exclude = "Linux", Reason = "Attribute change triggers watcher")]
+        public void ChangingAttributesDoesNotTriggerWatcher()
+        {
+            FileInfo fi = new FileInfo(fileName);
+            FileAttributes attr = fi.Attributes;
+            fi.Attributes = FileAttributes.Hidden | attr;
+
+            WaitForTimerExpiration();
+            Assert.AreEqual(0, handler.Counter);
+        }
+
+        [Test]
+        public void CopyingFileDoesNotTriggerWatcher()
+        {
+            FileInfo fi = new FileInfo(fileName);
+            fi.CopyTo(tempFileName);
+            fi.Delete();
+
+            WaitForTimerExpiration();
+            Assert.AreEqual(0, handler.Counter);
+        }
+
+        private static void WaitForTimerExpiration()
+        {
+            System.Threading.Thread.Sleep(watcherDelayMs * 2);
+        }
+
+        private class CounterEventHandler
+        {
+            int counter;
+            String fileName;
+            public int Counter
+            {
+                get { return counter; }
+            }
+            public String FileName
+            {
+                get { return fileName; }
+            }
+
+            public void OnChanged(String fullPath)
+            {
+                fileName = fullPath;
+                counter++;
+            }
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/NUnitProjectLoad.cs b/src/ClientUtilities/tests/NUnitProjectLoad.cs
index e5af34a..7f1e2cc 100644
--- a/src/ClientUtilities/tests/NUnitProjectLoad.cs
+++ b/src/ClientUtilities/tests/NUnitProjectLoad.cs
@@ -15,7 +15,7 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class NUnitProjectLoad
 	{
-		static readonly string xmlfile = "test.nunit";
+		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
         static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
 
 		private ProjectService projectService;
@@ -68,15 +68,17 @@ namespace NUnit.Util.Tests
 			LoadProject( NUnitProjectXml.NormalProject );
 			Assert.AreEqual( 2, project.Configs.Count );
 
+            string tempPath = Path.GetTempPath();
+
 			ProjectConfig config1 = project.Configs["Debug"];
 			Assert.AreEqual( 2, config1.Assemblies.Count );
-			Assert.AreEqual( Path.GetFullPath( @"bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" ), config1.Assemblies[0] );
-			Assert.AreEqual( Path.GetFullPath( @"bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" ), config1.Assemblies[1] );
+			Assert.AreEqual( Path.Combine(tempPath, @"bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" ), config1.Assemblies[0] );
+			Assert.AreEqual( Path.Combine(tempPath, @"bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" ), config1.Assemblies[1] );
 
 			ProjectConfig config2 = project.Configs["Release"];
 			Assert.AreEqual( 2, config2.Assemblies.Count );
-			Assert.AreEqual( Path.GetFullPath( @"bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly1.dll" ), config2.Assemblies[0] );
-			Assert.AreEqual( Path.GetFullPath( @"bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly2.dll" ), config2.Assemblies[1] );
+			Assert.AreEqual( Path.Combine(tempPath, @"bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly1.dll" ), config2.Assemblies[0] );
+			Assert.AreEqual( Path.Combine(tempPath, @"bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly2.dll" ), config2.Assemblies[1] );
 		}
 
 		[Test]
@@ -93,7 +95,7 @@ namespace NUnit.Util.Tests
 		{
 			NUnitProject project = projectService.WrapAssembly(mockDll);
 			Assert.AreEqual( "Default", project.ActiveConfigName );
-			Assert.AreEqual( mockDll, project.ActiveConfig.Assemblies[0] );
+			Assert.SamePath( mockDll, project.ActiveConfig.Assemblies[0] );
 			Assert.IsTrue( project.IsLoadable, "Not loadable" );
 			Assert.IsTrue( project.IsAssemblyWrapper, "Not wrapper" );
 			Assert.IsFalse( project.IsDirty, "Not dirty" );
diff --git a/src/ClientUtilities/tests/NUnitProjectSave.cs b/src/ClientUtilities/tests/NUnitProjectSave.cs
index af0d254..e00a0bf 100644
--- a/src/ClientUtilities/tests/NUnitProjectSave.cs
+++ b/src/ClientUtilities/tests/NUnitProjectSave.cs
@@ -15,7 +15,7 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class NUnitProjectSave
 	{
-		static readonly string xmlfile = "test.nunit";
+		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
 
 		private NUnitProject project;
 
@@ -62,15 +62,17 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void SaveNormalProject()
 		{
+            string tempPath = Path.GetTempPath();
+
 			ProjectConfig config1 = new ProjectConfig( "Debug" );
 			config1.BasePath = "bin" + Path.DirectorySeparatorChar + "debug";
-			config1.Assemblies.Add( Path.GetFullPath( "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" ) );
-			config1.Assemblies.Add( Path.GetFullPath( "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" ) );
+			config1.Assemblies.Add( Path.Combine(tempPath, "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly1.dll" ) );
+			config1.Assemblies.Add( Path.Combine(tempPath, "bin" + Path.DirectorySeparatorChar + "debug" + Path.DirectorySeparatorChar + "assembly2.dll" ) );
 
 			ProjectConfig config2 = new ProjectConfig( "Release" );
 			config2.BasePath = "bin" + Path.DirectorySeparatorChar + "release";
-			config2.Assemblies.Add( Path.GetFullPath( "bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly1.dll" ) );
-			config2.Assemblies.Add( Path.GetFullPath( "bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly2.dll" ) );
+			config2.Assemblies.Add( Path.Combine(tempPath, "bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly1.dll" ) );
+			config2.Assemblies.Add( Path.Combine(tempPath, "bin" + Path.DirectorySeparatorChar + "release" + Path.DirectorySeparatorChar + "assembly2.dll" ) );
 
 			project.Configs.Add( config1 );
 			project.Configs.Add( config2 );
diff --git a/src/ClientUtilities/tests/NUnitProjectTests.cs b/src/ClientUtilities/tests/NUnitProjectTests.cs
index 4791701..8b046c6 100644
--- a/src/ClientUtilities/tests/NUnitProjectTests.cs
+++ b/src/ClientUtilities/tests/NUnitProjectTests.cs
@@ -15,7 +15,7 @@ namespace NUnit.Util.Tests
 	[TestFixture]
 	public class NUnitProjectTests
 	{
-		static readonly string xmlfile = "test.nunit";
+		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
         static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
 
 		private NUnitProject project;
@@ -262,13 +262,15 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void SaveAndLoadConfigsWithAssemblies()
 		{
+            string tempPath = Path.GetTempPath();
+
 			ProjectConfig config1 = new ProjectConfig( "Debug" );
-			config1.Assemblies.Add( Path.GetFullPath( @"bin\debug\assembly1.dll" ) );
-			config1.Assemblies.Add( Path.GetFullPath( @"bin\debug\assembly2.dll" ) );
+            config1.Assemblies.Add(Path.Combine(tempPath, @"bin\debug\assembly1.dll"));
+            config1.Assemblies.Add(Path.Combine(tempPath, @"bin\debug\assembly2.dll"));
 
 			ProjectConfig config2 = new ProjectConfig( "Release" );
-			config2.Assemblies.Add( Path.GetFullPath( @"bin\release\assembly1.dll" ) );
-			config2.Assemblies.Add( Path.GetFullPath( @"bin\release\assembly2.dll" ) );
+            config2.Assemblies.Add(Path.Combine(tempPath, @"bin\release\assembly1.dll"));
+            config2.Assemblies.Add(Path.Combine(tempPath, @"bin\release\assembly2.dll"));
 
 			project.Configs.Add( config1 );
 			project.Configs.Add( config2 );
@@ -282,13 +284,13 @@ namespace NUnit.Util.Tests
 
 			config1 = project2.Configs["Debug"];
 			Assert.AreEqual( 2, config1.Assemblies.Count );
-			Assert.AreEqual( Path.GetFullPath( @"bin\debug\assembly1.dll" ), config1.Assemblies[0] );
-			Assert.AreEqual( Path.GetFullPath( @"bin\debug\assembly2.dll" ), config1.Assemblies[1] );
+            Assert.AreEqual(Path.Combine(tempPath, @"bin\debug\assembly1.dll"), config1.Assemblies[0]);
+            Assert.AreEqual(Path.Combine(tempPath, @"bin\debug\assembly2.dll"), config1.Assemblies[1]);
 
 			config2 = project2.Configs["Release"];
 			Assert.AreEqual( 2, config2.Assemblies.Count );
-			Assert.AreEqual( Path.GetFullPath( @"bin\release\assembly1.dll" ), config2.Assemblies[0] );
-			Assert.AreEqual( Path.GetFullPath( @"bin\release\assembly2.dll" ), config2.Assemblies[1] );
+            Assert.AreEqual(Path.Combine(tempPath, @"bin\release\assembly1.dll"), config2.Assemblies[0]);
+            Assert.AreEqual(Path.Combine(tempPath, @"bin\release\assembly2.dll"), config2.Assemblies[1]);
 		}
 	}
 }
diff --git a/src/ClientUtilities/tests/PathUtilTests.cs b/src/ClientUtilities/tests/PathUtilTests.cs
index 839f1e5..f9f8d7a 100644
--- a/src/ClientUtilities/tests/PathUtilTests.cs
+++ b/src/ClientUtilities/tests/PathUtilTests.cs
@@ -110,15 +110,15 @@ namespace NUnit.Util.Tests
             Assert.AreEqual(string.Empty,
                 PathUtils.RelativePath(@"C:\", @"C:\"));
 
-            // First path consisting just of a root:
+            // First filePath consisting just of a root:
             Assert.AreEqual(@"folder1\folder2", PathUtils.RelativePath(
                 @"C:\", @"C:\folder1\folder2"));
             
-            // Trailing directory separator in first path shall be ignored:
+            // Trailing directory separator in first filePath shall be ignored:
             Assert.AreEqual(@"folder2\folder3", PathUtils.RelativePath(
                 @"c:\folder1\", @"c:\folder1\folder2\folder3"));
             
-            // Case-insensitive behaviour, preserving 2nd path directories in result:
+            // Case-insensitive behaviour, preserving 2nd filePath directories in result:
             Assert.AreEqual(@"Folder2\Folder3", PathUtils.RelativePath(
                 @"C:\folder1", @"c:\folder1\Folder2\Folder3"));
             Assert.AreEqual(@"..\Folder2\folder3", PathUtils.RelativePath(
@@ -216,11 +216,11 @@ namespace NUnit.Util.Tests
             Assert.AreEqual(string.Empty,
                 PathUtils.RelativePath("/", "/"));
             
-            // First path consisting just of a root:
+            // First filePath consisting just of a root:
             Assert.AreEqual("folder1/folder2", PathUtils.RelativePath(
                 "/", "/folder1/folder2"));
             
-            // Trailing directory separator in first path shall be ignored:
+            // Trailing directory separator in first filePath shall be ignored:
             Assert.AreEqual("folder2/folder3", PathUtils.RelativePath(
                 "/folder1/", "/folder1/folder2/folder3"));
             
diff --git a/src/ClientUtilities/tests/ProjectConfigTests.cs b/src/ClientUtilities/tests/ProjectConfigTests.cs
index 561aa6f..737cc59 100644
--- a/src/ClientUtilities/tests/ProjectConfigTests.cs
+++ b/src/ClientUtilities/tests/ProjectConfigTests.cs
@@ -34,9 +34,9 @@ namespace NUnit.Util.Tests
 		}
 
         /// <summary>
-        /// Take a valid Linux path and make a valid windows path out of it
+        /// Take a valid Linux filePath and make a valid windows filePath 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.
+        /// filePath starts with a slash, add C: in front of it.
         /// </summary>
         private string TestPath(string path)
         {
diff --git a/src/ClientUtilities/tests/RemoteTestResultTest.cs b/src/ClientUtilities/tests/RemoteTestResultTest.cs
index 1255cc0..5ee82af 100644
--- a/src/ClientUtilities/tests/RemoteTestResultTest.cs
+++ b/src/ClientUtilities/tests/RemoteTestResultTest.cs
@@ -33,14 +33,15 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void ResultStillValidAfterDomainUnload() 
 		{
+            //TODO: This no longer appears to test anything
 			TestPackage package = new TestPackage( mockDll );
 			Assert.IsTrue( domain.Load( package ) );
-			TestResult result = domain.Run( new NullListener() );
+			TestResult result = domain.Run( new NullListener(), TestFilter.Empty, false, LoggingThreshold.Off );
 			TestResult caseResult = findCaseResult(result);
 			Assert.IsNotNull(caseResult);
-			TestResultItem item = new TestResultItem(caseResult);
-			string message = item.GetMessage();
-			Assert.IsNotNull(message);
+            //TestResultItem item = new TestResultItem(caseResult);
+            //string message = item.GetMessage();
+            //Assert.IsNotNull(message);
 		}
 
         [Test, Explicit("Fails intermittently")]
@@ -48,7 +49,7 @@ namespace NUnit.Util.Tests
         {
             TestDomain domain = new TestDomain();
             domain.Load( new TestPackage( mockDll ) );
-            domain.Run(new NullListener());
+            domain.Run(new NullListener(), TestFilter.Empty, false, LoggingThreshold.Off);
             domain.Unload();
         }
 
diff --git a/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs b/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
index 0f08020..218fc7e 100644
--- a/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
+++ b/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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;
 
diff --git a/src/ClientUtilities/tests/TestAgentTests.cs b/src/ClientUtilities/tests/TestAgentTests.cs
index ae245f4..9feb505 100644
--- a/src/ClientUtilities/tests/TestAgentTests.cs
+++ b/src/ClientUtilities/tests/TestAgentTests.cs
@@ -19,34 +19,5 @@ namespace NUnit.Util.Tests
             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 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 32c5617..7104453 100644
--- a/src/ClientUtilities/tests/TestDomainFixture.cs
+++ b/src/ClientUtilities/tests/TestDomainFixture.cs
@@ -44,22 +44,22 @@ namespace NUnit.Util.Tests
 			Assert.AreEqual(MockAssembly.Tests, loadedTest.TestCount );
 		}
 
-		[Test]
+        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
 		public void AppDomainIsSetUpCorrectly()
 		{
 			AppDomain domain = testDomain.AppDomain;
 			AppDomainSetup setup = testDomain.AppDomain.SetupInformation;
 
             Assert.That(setup.ApplicationName, Is.StringStarting("Tests_"));
-			Assert.AreEqual( Path.GetDirectoryName(mockDll), setup.ApplicationBase, "ApplicationBase" );
+			Assert.That(setup.ApplicationBase, Is.SamePath(Path.GetDirectoryName(mockDll)), "ApplicationBase");
 			Assert.That( 
                 Path.GetFileName( setup.ConfigurationFile ),
                 Is.EqualTo("mock-assembly.dll.config").IgnoreCase,
                 "ConfigurationFile");
 			Assert.AreEqual( null, setup.PrivateBinPath, "PrivateBinPath" );
-			Assert.AreEqual( Path.GetDirectoryName(mockDll), setup.ShadowCopyDirectories, "ShadowCopyDirectories" );
+			Assert.That(setup.ShadowCopyDirectories, Is.SamePath(Path.GetDirectoryName(mockDll)), "ShadowCopyDirectories" );
 
-			Assert.AreEqual( Path.GetDirectoryName(mockDll), domain.BaseDirectory, "BaseDirectory" );
+			Assert.That(domain.BaseDirectory, Is.SamePath(Path.GetDirectoryName(mockDll)), "BaseDirectory" );
             Assert.That(domain.FriendlyName, 
                 Is.EqualTo("test-domain-mock-assembly.dll").IgnoreCase, "FriendlyName");
 			Assert.IsTrue( testDomain.AppDomain.ShadowCopyFiles, "ShadowCopyFiles" );
@@ -68,7 +68,7 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void CanRunMockAssemblyTests()
 		{
-			TestResult result = testDomain.Run( NullListener.NULL );
+			TestResult result = testDomain.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
 			Assert.IsNotNull(result);
 
             ResultSummarizer summarizer = new ResultSummarizer(result);
@@ -154,7 +154,7 @@ namespace NUnit.Util.Tests
 			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
 			testDomain.Load( package );
 
-			TestResult result = testDomain.Run( NullListener.NULL );
+			TestResult result = testDomain.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
 
             ResultSummarizer summarizer = new ResultSummarizer(result);
             Assert.AreEqual(MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun");
@@ -163,7 +163,7 @@ namespace NUnit.Util.Tests
             Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
         }
 
-		[Test]
+        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
 		public void ConfigFileOverrideIsHonored()
 		{
 			TestPackage package = new TestPackage( "MyProject.nunit" );
@@ -186,10 +186,10 @@ namespace NUnit.Util.Tests
 
 			testDomain.Load( package );
 
-			Assert.AreEqual(  package.BasePath, testDomain.AppDomain.BaseDirectory );
+			Assert.That(testDomain.AppDomain.BaseDirectory, Is.SamePath(package.BasePath));
 		}
 
-		[Test]
+        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
 		public void BinPathOverrideIsHonored()
 		{
 			TestPackage package = new TestPackage( "MyProject.nunit" );
diff --git a/src/ClientUtilities/tests/TestDomainTests_Multiple.cs b/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
index 321c992..7c70195 100644
--- a/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
+++ b/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
@@ -74,7 +74,7 @@ namespace NUnit.Util.Tests
 		[Test]
 		public void RunMultipleAssemblies()
 		{
-			TestResult result = domain.Run(NullListener.NULL);
+			TestResult result = domain.Run(NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off);
 			ResultSummarizer summary = new ResultSummarizer(result);
 			Assert.AreEqual(
 				NoNamespaceTestFixture.Tests + MockAssembly.TestsRun, 
diff --git a/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs b/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
index aac05d6..2a8b0ae 100644
--- a/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
+++ b/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
@@ -150,7 +150,7 @@ namespace NUnit.Util.Tests
             //loader.ReloadOnRun = false;
 			
 			LoadTest( assembly );
-			loader.RunTests();
+			loader.RunTests(TestFilter.Empty);
 			do 
 			{
 				// TODO: Find a more robust way of handling this
diff --git a/src/ClientUtilities/tests/TestLoaderWatcherTests.cs b/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
index 87ad040..d0b2c61 100644
--- a/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
+++ b/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
@@ -36,7 +36,7 @@ namespace NUnit.Util.Tests
 		private void AssertWatcherIsPrepared()
 		{
 			Assert.IsTrue(mockWatcher.IsWatching);
-			CollectionAssert.AreEquivalent(new string[] { assembly }, mockWatcher.AssembliesToWatch);
+			Assert.SamePath(assembly, mockWatcher.AssembliesToWatch[0]);
 		}
 
 		[Test]
@@ -108,7 +108,7 @@ namespace NUnit.Util.Tests
 	internal class MockAssemblyWatcher2 : IAssemblyWatcher
 	{
 		public bool IsWatching;
-#if NET_2_0 || NET_4_0
+#if CLR_2_0 || CLR_4_0 || CLR_4_0
         public System.Collections.Generic.IList<string> AssembliesToWatch;
 #else
 		public System.Collections.IList AssembliesToWatch;
@@ -125,7 +125,7 @@ namespace NUnit.Util.Tests
 			IsWatching = true;
 		}
 
-#if NET_2_0 || NET_4_0
+#if CLR_2_0 || CLR_4_0
 		public void Setup(int delayInMs, System.Collections.Generic.IList<string> assemblies)
 #else
         public void Setup(int delayInMs, System.Collections.IList assemblies)
diff --git a/src/ClientUtilities/tests/TestRunnerFactoryTests.cs b/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
index ce3e2e6..2d7639e 100644
--- a/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
+++ b/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
@@ -1,4 +1,9 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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;
 
@@ -26,6 +31,7 @@ namespace NUnit.Util.Tests
             Assert.That( factory.MakeTestRunner(package), Is.TypeOf(typeof(TestDomain)));
         }
 
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void DifferentRuntimeUsesProcessRunner()
         {
@@ -42,5 +48,6 @@ namespace NUnit.Util.Tests
             package.Settings["RuntimeFramework"] = new RuntimeFramework(currentFramework.Runtime, new Version(major,0));
             Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
         }
+#endif
     }
 }
diff --git a/src/ClientUtilities/tests/TestServerTests.cs b/src/ClientUtilities/tests/TestServerTests.cs
index 3c9341b..50d1c73 100644
--- a/src/ClientUtilities/tests/TestServerTests.cs
+++ b/src/ClientUtilities/tests/TestServerTests.cs
@@ -31,15 +31,15 @@ namespace NUnit.Util.Tests
     //        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 ) )
+    //            string filePath = cwd.Parent.Parent.Parent.Parent.FullName;
+    //            filePath = Path.Combine( filePath, "NUnitTestServer" );
+    //            filePath = Path.Combine( filePath, "nunit-server-exe" );
+    //            filePath = Path.Combine( filePath, "bin" );
+    //            filePath = Path.Combine( filePath, cwd.Name );
+    //            filePath = Path.Combine( filePath, "nunit-server.exe" );
+    //            if( File.Exists( filePath ) )
     //            {
-    //                serverPath = path;
+    //                serverPath = filePath;
     //                return;
     //            }
     //        }
diff --git a/src/ClientUtilities/tests/VSProjectTests.cs b/src/ClientUtilities/tests/VSProjectTests.cs
index ef0751d..32fe486 100644
--- a/src/ClientUtilities/tests/VSProjectTests.cs
+++ b/src/ClientUtilities/tests/VSProjectTests.cs
@@ -9,14 +9,14 @@ using System.IO;
 using System.Collections;
 using NUnit.Framework;
 using NUnit.TestUtilities;
+using NUnit.Util.Tests.resources;
 
 namespace NUnit.Util.Tests
 {
 	[TestFixture]
 	public class VSProjectTests
 	{
-		private string invalidFile = "invalid.csproj";
-		private string resourceDir = "resources";
+		private string invalidFile = Path.Combine(Path.GetTempPath(), "invalid.csproj");
 
 		private void WriteInvalidFile( string text )
 		{
@@ -58,7 +58,8 @@ namespace NUnit.Util.Tests
 		private void AssertCanLoadProject( string resourceName )
 		{
 			string fileName = Path.GetFileNameWithoutExtension( resourceName );
-			using( TempResourceFile file = new TempResourceFile( this.GetType(), resourceDir + "." + resourceName, resourceName ) )
+
+            using (TestResource file = new TestResource(resourceName))
 			{
 				VSProject project = new VSProject( file.Path );
 				Assert.AreEqual( fileName, project.Name );
@@ -122,17 +123,25 @@ namespace NUnit.Util.Tests
 			AssertCanLoadProject( "HebrewFileProblem.csproj" );
 		}
 
+        [Test]
+        public void LoadProjectWithMissingOutputPath()
+        {
+            AssertCanLoadProject("MissingOutputPath.csproj");
+        }
+
 		[Test]
 		public void LoadCppProjectWithMacros()
 		{
-			using ( TempResourceFile file = new TempResourceFile(this.GetType(), "resources.CPPLibrary.vcproj", "CPPLibrary.vcproj" ))
+            using (TestResource file = new TestResource("CPPLibrary.vcproj"))
 			{
 				VSProject project = new VSProject(file.Path);
 				Assert.AreEqual( "CPPLibrary", project.Name );
 				Assert.AreEqual( Path.GetFullPath(file.Path), project.ProjectPath);
-				Assert.AreEqual( Path.GetFullPath( @"debug\cpplibrary.dll" ).ToLower(), 
+				Assert.AreEqual( 
+                    Path.Combine(Path.GetTempPath(), @"debug\cpplibrary.dll" ).ToLower(), 
 					project.Configs["Debug|Win32"].Assemblies[0].ToString().ToLower());
-				Assert.AreEqual( Path.GetFullPath( @"release\cpplibrary.dll" ).ToLower(), 
+				Assert.AreEqual( 
+                    Path.Combine(Path.GetTempPath(), @"release\cpplibrary.dll" ).ToLower(), 
 					project.Configs["Release|Win32"].Assemblies[0].ToString().ToLower());
 			}
 		}
@@ -140,14 +149,16 @@ namespace NUnit.Util.Tests
         [Test]
         public void GenerateCorrectExtensionsFromVCProjectVS2005()     
 		{
-            using (TempResourceFile file = new TempResourceFile(this.GetType(), "resources.cpp-default-library_VS2005.vcproj", "cpp-default-library_VS2005.vcproj"))           
+            using (TestResource file = new TestResource("cpp-default-library_VS2005.vcproj"))           
 			{
                 VSProject project = new VSProject(file.Path);
                 Assert.AreEqual("cpp-default-library_VS2005", project.Name);
                 Assert.AreEqual(Path.GetFullPath(file.Path), project.ProjectPath);
-                Assert.AreEqual(Path.GetFullPath( TestPath( @"debug/cpp-default-library_VS2005.dll" ) ).ToLower(),
+                Assert.AreEqual(
+                    Path.Combine(Path.GetTempPath(), TestPath( @"debug/cpp-default-library_VS2005.dll" ) ).ToLower(),
                     project.Configs["Debug|Win32"].Assemblies[0].ToString().ToLower());
-                Assert.AreEqual(Path.GetFullPath( TestPath( @"release/cpp-default-library_VS2005.dll" ) ).ToLower(),
+                Assert.AreEqual(
+                    Path.Combine(Path.GetTempPath(), TestPath( @"release/cpp-default-library_VS2005.dll" ) ).ToLower(),
                     project.Configs["Release|Win32"].Assemblies[0].ToString().ToLower());
             }
         }
@@ -168,35 +179,35 @@ namespace NUnit.Util.Tests
 		public void InvalidXmlFormat()
 		{
 			WriteInvalidFile( "<VisualStudioProject><junk></VisualStudioProject>" );
-			new VSProject( @"." + System.IO.Path.DirectorySeparatorChar + "invalid.csproj" );
+			new VSProject( Path.Combine(Path.GetTempPath(), "invalid.csproj" ));
 		}
 
 		[Test, ExpectedException( typeof( ArgumentException ) )]
 		public void InvalidProjectFormat()
 		{
 			WriteInvalidFile( "<VisualStudioProject><junk></junk></VisualStudioProject>" );
-			new VSProject( @"." + System.IO.Path.DirectorySeparatorChar  + "invalid.csproj" );
+			new VSProject( Path.Combine(Path.GetTempPath(), "invalid.csproj" ));
 		}
 
 		[Test, ExpectedException( typeof( ArgumentException ) )]
 		public void MissingAttributes()
 		{
 			WriteInvalidFile( "<VisualStudioProject><CSharp><Build><Settings></Settings></Build></CSharp></VisualStudioProject>" );
-			new VSProject( @"." + System.IO.Path.DirectorySeparatorChar + "invalid.csproj" );
+			new VSProject( Path.Combine(Path.GetTempPath(), "invalid.csproj" ));
 		}
 
 		[Test]
 		public void NoConfigurations()
 		{
 			WriteInvalidFile( "<VisualStudioProject><CSharp><Build><Settings AssemblyName=\"invalid\" OutputType=\"Library\"></Settings></Build></CSharp></VisualStudioProject>" );
-			VSProject project = new VSProject( @"." + System.IO.Path.DirectorySeparatorChar  + "invalid.csproj" );
+			VSProject project = new VSProject( Path.Combine(Path.GetTempPath(),"invalid.csproj" ));
 			Assert.AreEqual( 0, project.Configs.Count );
 		}
 
 		/// <summary>
-		/// Take a valid Linux path and make a valid windows path out of it
+		/// Take a valid Linux filePath and make a valid windows filePath 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.
+		/// filePath starts with a slash, add C: in front of it.
 		/// </summary>
 		private string TestPath(string path)
 		{
diff --git a/src/ClientUtilities/tests/VisualStudioConverterTests.cs b/src/ClientUtilities/tests/VisualStudioConverterTests.cs
index 2497afe..8143481 100644
--- a/src/ClientUtilities/tests/VisualStudioConverterTests.cs
+++ b/src/ClientUtilities/tests/VisualStudioConverterTests.cs
@@ -9,20 +9,22 @@ using System.IO;
 using NUnit.Framework;
 using NUnit.TestUtilities;
 using NUnit.Util.ProjectConverters;
+using NUnit.Util.Tests.resources;
 
 namespace NUnit.Util.Tests
 {
 	[TestFixture]
 	public class VisualStudioConverterTests
 	{
-		static readonly string resourceDir = "resources";
-
 		private VisualStudioConverter converter;
+        static readonly bool useSolutionConfigs = 
+            Services.UserSettings.GetSetting("Options.TestLoader.VisualStudio.UseSolutionConfigs", true);
 		
 		private void AssertCanLoadVsProject( string resourceName )
 		{
 			string fileName = Path.GetFileNameWithoutExtension( resourceName );
-			using( TempResourceFile file = new TempResourceFile( this.GetType(), resourceDir + "." + resourceName, resourceName ) )
+
+			using( TestResource file = new TestResource(resourceName) ) 
 			{
 				NUnitProject project = converter.ConvertFrom( file.Path );
 				Assert.AreEqual( fileName, project.Name );
@@ -72,18 +74,27 @@ namespace NUnit.Util.Tests
 		[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" ))
+			using(new TestResource("csharp-sample.csproj", @"csharp\csharp-sample.csproj"))
+			using(new TestResource("jsharp.vjsproj", @"jsharp\jsharp.vjsproj"))
+			using(new TestResource("vb-sample.vbproj", @"vb\vb-sample.vbproj"))
+			using(new TestResource("cpp-sample.vcproj", @"cpp-sample\cpp-sample.vcproj"))
+			using(TestResource file = new TestResource("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 );
+                if (useSolutionConfigs)
+                {
+                    Assert.AreEqual(2, project.Configs.Count);
+                    Assert.AreEqual(4, project.Configs["Debug"].Assemblies.Count);
+                    Assert.AreEqual(4, project.Configs["Release"].Assemblies.Count);
+                }
+                else
+                {
+                    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" );
 			}
@@ -92,18 +103,27 @@ namespace NUnit.Util.Tests
 		[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"))
+            using (new TestResource("csharp-sample_VS2005.csproj", @"csharp\csharp-sample_VS2005.csproj"))
+            using (new TestResource("jsharp_VS2005.vjsproj", @"jsharp\jsharp_VS2005.vjsproj"))
+            using (new TestResource("vb-sample_VS2005.vbproj", @"vb\vb-sample_VS2005.vbproj"))
+            using (new TestResource("cpp-sample_VS2005.vcproj", @"cpp-sample\cpp-sample_VS2005.vcproj"))
+            using (TestResource file = new TestResource("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 );
+                if (useSolutionConfigs)
+                {
+                    Assert.AreEqual(2, project.Configs.Count);
+                    Assert.AreEqual(4, project.Configs["Debug"].Assemblies.Count);
+                    Assert.AreEqual(4, project.Configs["Release"].Assemblies.Count);
+                }
+                else
+                {
+                    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" );
 			}
@@ -112,8 +132,8 @@ namespace NUnit.Util.Tests
 		[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" ) )
+            using (new TestResource("ClassLibrary1.csproj", @"ClassLibrary1\ClassLibrary1.csproj"))
+            using (TestResource file = new TestResource("WebApplication1.sln"))
 			{
 				NUnitProject project = converter.ConvertFrom( Path.GetFullPath( file.Path ) );
 				Assert.AreEqual( 2, project.Configs.Count );
@@ -125,29 +145,55 @@ namespace NUnit.Util.Tests
 		[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" ) ) 
+            using (new TestResource("ClassLibrary1.csproj", @"ClassLibrary1\ClassLibrary1.csproj"))
+            using (new TestResource("Unmanaged.vcproj", @"Unmanaged\Unmanaged.vcproj"))
+            using (TestResource file = new TestResource("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 );
+                if (useSolutionConfigs)
+                {
+                    Assert.AreEqual(2, project.Configs.Count);
+                    Assert.AreEqual(2, project.Configs["Debug"].Assemblies.Count);
+                    Assert.AreEqual(2, project.Configs["Release"].Assemblies.Count);
+                }
+                else
+                {
+                    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" ) )
+            using (TestResource file = new TestResource("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 );
-			}
+                Assert.AreEqual(1, project.Configs["Debug|Win32"].Assemblies.Count);
+                Assert.AreEqual(1, project.Configs["Release|Win32"].Assemblies.Count);
+            }
 		}
+
+        [Test]
+        public void FromSolutionWithDisabledProject()
+        {
+            using (new TestResource("DisabledProject.csproj", @"DisabledProject\DisabledProject.csproj"))
+            using (new TestResource("DebugOnly.csproj", @"DebugOnly\DebugOnly.csproj"))
+            using (TestResource file = new TestResource("DisabledProject.sln"))
+            {
+                NUnitProject project = converter.ConvertFrom(file.Path);
+                Assert.AreEqual(2, project.Configs.Count);
+                Assert.AreEqual(2, project.Configs["Release"].Assemblies.Count, "Release should have 2 assemblies");
+                if (useSolutionConfigs)
+                    Assert.AreEqual(1, project.Configs["Debug"].Assemblies.Count, "Debug should have 1 assembly");
+                else
+                    Assert.AreEqual(2, project.Configs["Debug"].Assemblies.Count, "Debug should have 2 assemblies");
+            }
+        }
 	}
 }
diff --git a/src/ClientUtilities/tests/nunit.util.tests.build b/src/ClientUtilities/tests/nunit.util.tests.build
index 5412498..98b3da0 100644
--- a/src/ClientUtilities/tests/nunit.util.tests.build
+++ b/src/ClientUtilities/tests/nunit.util.tests.build
@@ -2,43 +2,45 @@
 <project name="NUnit.Util.Tests" default="build">
 
   <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"/>
-        <include name="MockAssemblyWatcher.cs"/>
-        <include name="NUnitProjectLoad.cs"/>
-        <include name="NUnitProjectSave.cs"/>
-        <include name="NUnitProjectTests.cs"/>
-        <include name="NUnitProjectXml.cs"/>
-        <include name="NUnitRegistryTests.cs"/>
-        <include name="PathUtilTests.cs"/>
-        <include name="ProcessRunnerTests.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"/>
-        <include name="SummaryResultFixture.cs"/>
-        <include name="TestAgencyTests.cs"/>
-        <include name="TestAgentTests.cs"/>
-        <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="XmlResultWriterTest.cs"/>
+    <include name="AssemblyListTests.cs"/>
+    <include name="AssemblyWatcherTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="CategoryParseTests.cs"/>
+    <include name="CategoryManagerTest.cs"/>
+    <include name="DomainManagerTests.cs"/>
+    <include name="EventDispatcherTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="FileWatcherTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="MemorySettingsStorageTests.cs"/>
+    <include name="MockAssemblyWatcher.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="NUnitProjectLoad.cs"/>
+    <include name="NUnitProjectSave.cs"/>
+    <include name="NUnitProjectTests.cs"/>
+    <include name="NUnitProjectXml.cs"/>
+    <include name="NUnitRegistryTests.cs"/>
+    <include name="PathUtilTests.cs"/>
+    <include name="ProcessRunnerTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="ProjectConfigTests.cs"/>
+    <include name="RecentFileEntryTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="RecentFilesTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="RegistrySettingsStorageTests.cs"/>
+    <include name="RemoteTestResultTest.cs"/>
+    <include name="RuntimeFrameworkSelectorTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="ServerUtilityTests.cs"/>
+    <include name="ServiceManagerSetUpFixture.cs"/>
+    <include name="SettingsGroupTests.cs"/>
+    <include name="SummaryResultFixture.cs"/>
+    <include name="TestAgencyTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestAgentTests.cs"/>
+    <include name="TestDomainFixture.cs"/>
+    <include name="TestDomainTests_Multiple.cs"/>
+    <include name="TestEventCatcher.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestLoaderWatcherTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestLoaderAssemblyTests.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestRunnerFactoryTests.cs"/>
+    <include name="TestServerTests.cs"/>
+    <include name="VisualStudioConverterTests.cs"/>
+    <include name="resources/TestResource.cs"/>
+    <include name="VSProjectTests.cs"/>
+    <include name="XmlResultWriterTest.cs"/>
   </patternset>
 
   <patternset id="resource-files">
diff --git a/src/ClientUtilities/tests/nunit.util.tests.csproj b/src/ClientUtilities/tests/nunit.util.tests.csproj
index ff2a0bd..d7b58b2 100644
--- a/src/ClientUtilities/tests/nunit.util.tests.csproj
+++ b/src/ClientUtilities/tests/nunit.util.tests.csproj
@@ -22,14 +22,13 @@
     <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>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;CLR_2_0;CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -46,7 +45,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;NET_2_0;CLR_2_0;CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -127,6 +126,7 @@
     <EmbeddedResource Include="resources\vb-sample_VS2005.vbproj" />
     <EmbeddedResource Include="resources\WebApplication1.sln" />
     <EmbeddedResource Include="resources\XNAWindowsProject.csproj" />
+    <EmbeddedResource Include="resources\MissingOutputPath.csproj" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="resources\cpp-default-library_VS2005.vcproj" />
@@ -141,11 +141,12 @@
       <Link>CommonAssemblyInfo.cs</Link>
     </Compile>
     <Compile Include="AssemblyListTests.cs" />
+    <Compile Include="AssemblyWatcherTests.cs" />
     <Compile Include="CategoryManagerTest.cs" />
     <Compile Include="CategoryParseTests.cs" />
     <Compile Include="DomainManagerTests.cs" />
     <Compile Include="EventDispatcherTests.cs" />
-    <Compile Include="FileWatcherTest.cs" />
+    <Compile Include="FileWatcherTests.cs" />
     <Compile Include="MemorySettingsStorageTests.cs" />
     <Compile Include="MockAssemblyWatcher.cs" />
     <Compile Include="NUnitProjectLoad.cs" />
@@ -160,6 +161,7 @@
     <Compile Include="RecentFilesTests.cs" />
     <Compile Include="RegistrySettingsStorageTests.cs" />
     <Compile Include="RemoteTestResultTest.cs" />
+    <Compile Include="resources\TestResource.cs" />
     <Compile Include="RuntimeFrameworkSelectorTests.cs" />
     <Compile Include="ServerUtilityTests.cs" />
     <Compile Include="ServiceManagerSetUpFixture.cs" />
@@ -181,6 +183,15 @@
   <ItemGroup>
     <None Include="nunit.util.tests.build" />
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\DisabledProject.sln" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\DisabledProject.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\DebugOnly.csproj" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PreBuildEvent>
diff --git a/src/ClientUtilities/tests/resources/DebugOnly.csproj b/src/ClientUtilities/tests/resources/DebugOnly.csproj
new file mode 100644
index 0000000..1f034a7
--- /dev/null
+++ b/src/ClientUtilities/tests/resources/DebugOnly.csproj
@@ -0,0 +1,59 @@
+<?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>{B9DB5E6C-8A54-40F9-9B1E-225B58FE7ED4}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DebugOnly</RootNamespace>
+    <AssemblyName>DebugOnly</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </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>
+  </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>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Class1.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\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/ClientUtilities/tests/resources/DisabledProject.csproj b/src/ClientUtilities/tests/resources/DisabledProject.csproj
new file mode 100644
index 0000000..1fd4aea
--- /dev/null
+++ b/src/ClientUtilities/tests/resources/DisabledProject.csproj
@@ -0,0 +1,59 @@
+<?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>{45103FD8-4F1F-4B2D-9E75-20094E98EE64}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DisabledProject</RootNamespace>
+    <AssemblyName>DisabledProject</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </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>
+  </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>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\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/ClientUtilities/tests/resources/DisabledProject.sln b/src/ClientUtilities/tests/resources/DisabledProject.sln
new file mode 100644
index 0000000..bfca6c9
--- /dev/null
+++ b/src/ClientUtilities/tests/resources/DisabledProject.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DisabledProject", "DisabledProject\DisabledProject.csproj", "{45103FD8-4F1F-4B2D-9E75-20094E98EE64}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DebugOnly", "DebugOnly\DebugOnly.csproj", "{B9DB5E6C-8A54-40F9-9B1E-225B58FE7ED4}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{45103FD8-4F1F-4B2D-9E75-20094E98EE64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{45103FD8-4F1F-4B2D-9E75-20094E98EE64}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{45103FD8-4F1F-4B2D-9E75-20094E98EE64}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{45103FD8-4F1F-4B2D-9E75-20094E98EE64}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B9DB5E6C-8A54-40F9-9B1E-225B58FE7ED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B9DB5E6C-8A54-40F9-9B1E-225B58FE7ED4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B9DB5E6C-8A54-40F9-9B1E-225B58FE7ED4}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/src/ClientUtilities/tests/resources/MissingOutputPath.csproj b/src/ClientUtilities/tests/resources/MissingOutputPath.csproj
new file mode 100644
index 0000000..73af5d6
--- /dev/null
+++ b/src/ClientUtilities/tests/resources/MissingOutputPath.csproj
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>    
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6BF38215-C9D9-418D-9D81-4DECBA679223}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>MissingOutputPath</RootNamespace>
+    <AssemblyName>MissingOutputPath</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+	<OutputPath>bin\Common\</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>    
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>    
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Class1.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\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/ClientUtilities/tests/resources/TestResource.cs b/src/ClientUtilities/tests/resources/TestResource.cs
new file mode 100644
index 0000000..1aad572
--- /dev/null
+++ b/src/ClientUtilities/tests/resources/TestResource.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace NUnit.Util.Tests.resources
+{
+    public class TestResource : NUnit.TestUtilities.TempResourceFile
+    {
+        public TestResource(string name)
+            : base(typeof(TestResource), name)
+        {
+        }
+
+        public TestResource(string name, string filePath)
+            : base(typeof(TestResource), name, filePath)
+        {
+        }
+    }
+}
diff --git a/src/ClientUtilities/util/AggregatingTestRunner.cs b/src/ClientUtilities/util/AggregatingTestRunner.cs
index 48dca4e..85ffd86 100644
--- a/src/ClientUtilities/util/AggregatingTestRunner.cs
+++ b/src/ClientUtilities/util/AggregatingTestRunner.cs
@@ -220,13 +220,14 @@ namespace NUnit.Util
 		public virtual void Unload()
 		{
             if (aggregateTest != null)
-            {
                 Log.Info("Unloading " + Path.GetFileName(aggregateTest.TestName.Name));
+
+            if (runners != null)
                 foreach (TestRunner runner in runners)
                     runner.Unload();
-                aggregateTest = null;
-                Log.Info("Unload complete");
-            }
+
+            aggregateTest = null;
+            Log.Info("Unload complete");
 		}
 		#endregion
 
@@ -241,13 +242,8 @@ namespace NUnit.Util
 		#endregion
 
 		#region Methods for Running Tests
-		public virtual TestResult Run( EventListener listener )
-		{
-			return Run( listener, TestFilter.Empty );
-		}
 
-        // All forms of Run and BeginRun eventually come here
-		public virtual TestResult Run(EventListener listener, ITestFilter filter )
+		public virtual TestResult Run(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
 		{
             Log.Info("Run - EventListener={0}", listener.GetType().Name);
 
@@ -271,7 +267,7 @@ namespace NUnit.Util
             {
                 foreach (TestRunner runner in runners)
                     if (filter.Pass(runner.Test))
-                        runner.BeginRun(this, filter);
+                        runner.BeginRun(this, filter, tracing, logLevel);
 
                 result = this.EndRun();
             }
@@ -279,7 +275,7 @@ namespace NUnit.Util
             {
                 foreach (TestRunner runner in runners)
                     if (filter.Pass(runner.Test))
-                        result.AddResult(runner.Run(this, filter));
+                        result.AddResult(runner.Run(this, filter, tracing, logLevel));
             }
 			
 			long stopTime = DateTime.Now.Ticks;
@@ -293,12 +289,7 @@ namespace NUnit.Util
 			return result;
 		}
 
-		public virtual void BeginRun( EventListener listener )
-		{
-			BeginRun( listener, TestFilter.Empty );
-		}
-
-		public virtual void BeginRun( EventListener listener, ITestFilter filter )
+		public virtual void BeginRun( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
 		{
 			// Save active listener for derived classes
 			this.listener = listener;
@@ -307,7 +298,7 @@ namespace NUnit.Util
 
             // ThreadedTestRunner will call our Run method on a separate thread
             ThreadedTestRunner threadedRunner = new ThreadedTestRunner(this);
-            threadedRunner.BeginRun(listener, filter);
+            threadedRunner.BeginRun(listener, filter, tracing, logLevel);
 		}
 
 		public virtual TestResult EndRun()
@@ -331,7 +322,7 @@ namespace NUnit.Util
 			foreach( TestRunner runner in runners )
 				runner.Wait();
 		}
-		#endregion
+        #endregion
 
 		#region EventListener Members
 		public void TestStarted(TestName testName)
@@ -434,6 +425,7 @@ namespace NUnit.Util
     #endregion
 
     #region MultipleTestProcessRunner
+#if CLR_2_0 || CLR_4_0
     public class MultipleTestProcessRunner : AggregatingTestRunner
     {
         #region Constructors
@@ -449,5 +441,6 @@ namespace NUnit.Util
         }
         #endregion
     }
+#endif
     #endregion
 }
diff --git a/src/ClientUtilities/util/AssemblyList.cs b/src/ClientUtilities/util/AssemblyList.cs
index ba9999e..11e5834 100644
--- a/src/ClientUtilities/util/AssemblyList.cs
+++ b/src/ClientUtilities/util/AssemblyList.cs
@@ -54,7 +54,18 @@ namespace NUnit.Util
 			}
 		}
 
-		protected override void OnRemoveComplete(int index, object value)
+        public bool Contains(string assemblyPath)
+        {
+            for (int index = 0; index < this.Count; index++)
+            {
+                if (this[index] == assemblyPath)
+                    return true;
+            }
+
+            return false;
+        }
+
+        protected override void OnRemoveComplete(int index, object value)
 		{
 			FireChangedEvent();
 		}
diff --git a/src/ClientUtilities/util/AssemblyWatcher.cs b/src/ClientUtilities/util/AssemblyWatcher.cs
index 230761f..d274a57 100644
--- a/src/ClientUtilities/util/AssemblyWatcher.cs
+++ b/src/ClientUtilities/util/AssemblyWatcher.cs
@@ -25,7 +25,6 @@ namespace NUnit.Util
 
         private FileSystemWatcher[] fileWatchers;
 		private FileInfo[] files;
-		private bool isWatching;
 
 		protected System.Timers.Timer timer;
 		protected string changedAssemblyPath;
@@ -40,7 +39,7 @@ namespace NUnit.Util
 			Setup(delay, new string[] {assemblyFileName});
 		}
 
-#if NET_2_0 || NET_4_0
+#if CLR_2_0 || CLR_4_0
 		public void Setup(int delay, System.Collections.Generic.IList<string> assemblies)
 #else
         public void Setup(int delay, System.Collections.IList assemblies)
@@ -86,8 +85,6 @@ namespace NUnit.Util
             if (fileWatchers != null)
     			foreach( FileSystemWatcher watcher in fileWatchers )
 	    			watcher.EnableRaisingEvents = enable;
-
-			isWatching = enable;
 		}
 
 		public void FreeResources()
diff --git a/src/ClientUtilities/util/CategoryManager.cs b/src/ClientUtilities/util/CategoryManager.cs
index df75952..cce4d49 100644
--- a/src/ClientUtilities/util/CategoryManager.cs
+++ b/src/ClientUtilities/util/CategoryManager.cs
@@ -19,18 +19,12 @@ namespace NUnit.Util
 			categories[name] = name;
 		}
 
-		public void Add(IList list) 
-		{
-			foreach(string name in list) 
-			{
-				Add(name);
-			}
-		}
-
 		public void AddCategories( ITest test )
 		{
-			if ( test.Categories != null )
-				Add( test.Categories );
+            if (test.Categories != null)
+                foreach (string name in test.Categories)
+                    if (NUnitFramework.IsValidCategoryName(name))
+                        Add(name);
 		}
 
 		public void AddAllCategories( ITest test )
diff --git a/src/ClientUtilities/util/DefaultTestRunnerFactory.cs b/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
index c462767..490ef34 100644
--- a/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
+++ b/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
@@ -16,6 +16,7 @@ namespace NUnit.Util
     /// </summary>
     public class DefaultTestRunnerFactory : InProcessTestRunnerFactory, ITestRunnerFactory
     {
+#if CLR_2_0 || CLR_4_0
         private RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();        
         
         /// <summary>
@@ -50,7 +51,7 @@ namespace NUnit.Util
 
             ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
             if (processModel == ProcessModel.Default)
-                if (!targetFramework.Matches(currentFramework))
+                if (!currentFramework.Supports(targetFramework))
                     processModel = ProcessModel.Separate;
 
             switch (processModel)
@@ -72,11 +73,10 @@ namespace NUnit.Util
 
             ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
             if (processModel == ProcessModel.Default)
-                if (!targetFramework.Matches(currentFramework))
+                if (!currentFramework.Supports(targetFramework))
                     processModel = ProcessModel.Separate;
             return processModel;
         }
+#endif
     }
-
-
 }
diff --git a/src/ClientUtilities/util/FileWatcher.cs b/src/ClientUtilities/util/FileWatcher.cs
new file mode 100644
index 0000000..cc80084
--- /dev/null
+++ b/src/ClientUtilities/util/FileWatcher.cs
@@ -0,0 +1,80 @@
+// ****************************************************************
+// 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.IO;
+using System.Timers;
+
+namespace NUnit.Util
+{
+    public delegate void FileChangedHandler(string filePath);
+
+    public interface IWatcher
+    {
+        int Delay { get; set; }
+
+        void Start();
+        void Stop();
+
+        event FileChangedHandler Changed;
+    }
+
+    public class FileWatcher : IDisposable
+    {
+        private string filePath;
+        private FileSystemWatcher watcher;
+        private Timer timer;
+
+        public FileWatcher(string filePath, int delay)
+        {
+            this.filePath = filePath;
+            this.watcher = new FileSystemWatcher();
+
+            watcher.Path = Path.GetDirectoryName(filePath);
+            watcher.Filter = Path.GetFileName(filePath);
+            watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
+            watcher.EnableRaisingEvents = false;
+            watcher.Changed += new FileSystemEventHandler(OnChange);
+
+            timer = new Timer(delay);
+            timer.AutoReset = false;
+            timer.Enabled = false;
+            timer.Elapsed += new ElapsedEventHandler(OnTimer);
+        }
+
+        public void Dispose()
+        {
+            watcher.Dispose();
+        }
+
+        public void Start()
+        {
+            watcher.EnableRaisingEvents = true;
+        }
+
+        public void Stop()
+        {
+            watcher.EnableRaisingEvents = false;
+        }
+
+        private void OnChange(object sender, FileSystemEventArgs e)
+        {
+            if (!timer.Enabled)
+                timer.Enabled = true;
+            timer.Start();
+        }
+
+        private void OnTimer(object sender, ElapsedEventArgs e)
+        {
+            timer.Enabled = false;
+
+            if (Changed != null)
+                Changed(filePath);
+        }
+
+        public event FileChangedHandler Changed;
+    }
+}
diff --git a/src/ClientUtilities/util/Guard.cs b/src/ClientUtilities/util/Guard.cs
new file mode 100644
index 0000000..d2c8240
--- /dev/null
+++ b/src/ClientUtilities/util/Guard.cs
@@ -0,0 +1,49 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util
+{
+#if CLR_2_0 || CLR_4_0
+    public static class Guard
+#else
+    public class Guard
+#endif
+    {
+        public static void ArgumentNotNull(object value, string name)
+        {
+            if (value == null)
+                throw new ArgumentNullException("Argument " + name + " must not be null", name);
+        }
+
+        public static void ArgumentNotNullOrEmpty(string value, string name)
+        {
+            ArgumentNotNull(value, name);
+
+            if (value == string.Empty)
+                throw new ArgumentException("Argument " + name +" must not be the empty string", name);
+        }
+
+        public static void NotNull(object value, string name)
+        {
+            if (value == null)
+                throw new InvalidOperationException("Invalid object state: " + name + " is null");
+        }
+
+        public static void Validate(ISelfValidating obj)
+        {
+            if (!obj.Validate())
+                throw new InvalidOperationException(obj.Message);
+        }
+    }
+
+    public interface ISelfValidating
+    {
+        bool Validate();
+        string Message { get; }
+    }
+}
diff --git a/src/ClientUtilities/util/IAssemblyWatcher.cs b/src/ClientUtilities/util/IAssemblyWatcher.cs
index 07c3f58..b2ebbc0 100644
--- a/src/ClientUtilities/util/IAssemblyWatcher.cs
+++ b/src/ClientUtilities/util/IAssemblyWatcher.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
 {
@@ -31,7 +37,7 @@ namespace NUnit.Util
 		/// </summary>
 		/// <param name="delayInMs">The delay in ms.</param>
 		/// <param name="assemblies">The assemblies.</param>
-#if NET_2_0 || NET_4_0
+#if CLR_2_0 || CLR_4_0
         void Setup(int delayInMs, System.Collections.Generic.IList<string> assemblies);
 #else
         void Setup(int delayInMs, System.Collections.IList assemblies);
diff --git a/src/ClientUtilities/util/Interfaces/ITestLoader.cs b/src/ClientUtilities/util/Interfaces/ITestLoader.cs
index 5689635..278c23f 100644
--- a/src/ClientUtilities/util/Interfaces/ITestLoader.cs
+++ b/src/ClientUtilities/util/Interfaces/ITestLoader.cs
@@ -69,10 +69,7 @@ namespace NUnit.Util
 		// Reload current test
 		void ReloadTest();
 
-		// Run all tests
-		void RunTests();
-
-		// Run specific tests
+		// Run the tests
 		void RunTests( ITestFilter filter );
 
 		// Cancel the running test
diff --git a/src/ClientUtilities/util/PathUtils.cs b/src/ClientUtilities/util/PathUtils.cs
index 3ea4319..63f33c4 100644
--- a/src/ClientUtilities/util/PathUtils.cs
+++ b/src/ClientUtilities/util/PathUtils.cs
@@ -173,6 +173,11 @@ namespace NUnit.Util
 			return result;
 		}
 
+        public static string Combine(Assembly assembly, params string[] morePaths)
+        {
+            return Combine(Path.GetDirectoryName(GetAssemblyPath(assembly)), morePaths);
+        }
+
 		// TODO: This logic should be in shared source
 		public static string GetAssemblyPath( Assembly assembly )
 		{
@@ -217,7 +222,7 @@ namespace NUnit.Util
         {
             char[] separators = new char[] { PathUtils.DirectorySeparatorChar, PathUtils.AltDirectorySeparatorChar };
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             return path.Split(separators, StringSplitOptions.RemoveEmptyEntries);
 #else
             string[] trialSplit = path.Split(separators);
@@ -242,7 +247,7 @@ namespace NUnit.Util
 
         private static bool PathsEqual(string path1, string path2)
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if (PathUtils.IsWindows())
                 return path1.Equals(path2, StringComparison.InvariantCultureIgnoreCase);
             else
diff --git a/src/ClientUtilities/util/ProcessRunner.cs b/src/ClientUtilities/util/ProcessRunner.cs
index b885921..8a4c002 100644
--- a/src/ClientUtilities/util/ProcessRunner.cs
+++ b/src/ClientUtilities/util/ProcessRunner.cs
@@ -101,8 +101,18 @@ namespace NUnit.Util
             if (this.agent != null)
             {
                 log.Info("Stopping remote agent");
-                agent.Stop();
-                this.agent = null;
+                try
+                {
+                    agent.Stop();
+                }
+                catch
+                {
+                    // Ignore any exception
+                }
+                finally
+                {
+                    this.agent = null;
+                }
             }
         }
 
diff --git a/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs b/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
index 912bf70..42823e9 100644
--- a/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
+++ b/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
@@ -4,6 +4,7 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
+using System.Collections;
 using System.IO;
 using NUnit.Core;
 using NUnit.Core.Extensibility;
@@ -25,42 +26,128 @@ namespace NUnit.Util.ProjectConverters
 
 		public NUnitProject ConvertFrom(string path)
 		{
-			NUnitProject project = new NUnitProject( Path.GetFullPath( path ) );
-
 			if ( VSProject.IsProjectFile(path) )
 			{
-				VSProject vsProject = new VSProject( path );
-				project.Add( vsProject );
+                return ConvertVSProject(path);
 			}
 			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();
-					}
-				}
+                return Services.UserSettings.GetSetting("Options.TestLoader.VisualStudio.UseSolutionConfigs", true)
+                    ? ConvertVSSolution(path)
+                    : LegacyConvertVSSolution(path);
 			}
 
+			return null;
+		}
+
+        private static NUnitProject ConvertVSProject(string path)
+        {
+            NUnitProject project = new NUnitProject(Path.GetFullPath(path));
+            project.Add(new VSProject(path));
 			project.IsDirty = false;
+            return project;
+        }
 
-			return project;
-		}
+        private static NUnitProject ConvertVSSolution(string path)
+        {
+            NUnitProject project = new NUnitProject(Path.GetFullPath(path));
+
+            string solutionDirectory = Path.GetDirectoryName(path);
+            using (StreamReader reader = new StreamReader(path))
+            {
+                char[] delims = { '=', ',' };
+                char[] trimchars = { ' ', '"' };
+                string buildMarker = ".Build.0 =";
+
+                Hashtable projectLookup = new Hashtable();
+
+                string line = reader.ReadLine();
+                while (line != null)
+                {
+                    if (line.StartsWith("Project("))
+                    {
+                        string[] parts = line.Split(delims);
+                        string vsProjectPath = parts[2].Trim(trimchars);
+                        string vsProjectGuid = parts[3].Trim(trimchars);
+
+                        if (VSProject.IsProjectFile(vsProjectPath))
+                            projectLookup[vsProjectGuid] = new VSProject(Path.Combine(solutionDirectory, vsProjectPath));
+                    }
+                    else if (line.IndexOf(buildMarker) >= 0)
+                    {
+                        line = line.Trim();
+                        int endBrace = line.IndexOf('}');
+
+                        string vsProjectGuid = line.Substring(0, endBrace + 1);
+                        VSProject vsProject = projectLookup[vsProjectGuid] as VSProject;
+
+                        if (vsProject != null)
+                        {
+                            line = line.Substring(endBrace + 2);
+
+                            int split = line.IndexOf(buildMarker) + 1;
+                            string solutionConfig = line.Substring(0, split - 1);
+                            int bar = solutionConfig.IndexOf('|');
+                            if (bar >= 0)
+                                solutionConfig = solutionConfig.Substring(0, bar);
+
+                            string projectConfig = line.Substring(split + buildMarker.Length);
+                            if (vsProject.Configs[projectConfig] == null)
+                            {
+                                bar = projectConfig.IndexOf('|');
+                                if (bar >= 0)
+                                    projectConfig = projectConfig.Substring(0, bar);
+                            }
+
+                            if (project.Configs[solutionConfig] == null)
+                                project.Configs.Add(new ProjectConfig(solutionConfig));
+
+                            foreach (string assembly in vsProject.Configs[projectConfig].Assemblies)
+                                if (!project.Configs[solutionConfig].Assemblies.Contains(assembly))
+                                    project.Configs[solutionConfig].Assemblies.Add(assembly);
+
+                            //if (VSProject.IsProjectFile(vsProjectPath))
+                            //    project.Add(new VSProject(Path.Combine(solutionDirectory, vsProjectPath)));
+                        }
+                    }
+
+                    line = reader.ReadLine();
+                }
+
+                project.IsDirty = false;
+                return project;
+            }
+        }
+
+        private static NUnitProject LegacyConvertVSSolution(string path)
+        {
+            NUnitProject project = new NUnitProject(Path.GetFullPath(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/RemoteTestAgent.cs b/src/ClientUtilities/util/RemoteTestAgent.cs
index 6086919..dfae857 100644
--- a/src/ClientUtilities/util/RemoteTestAgent.cs
+++ b/src/ClientUtilities/util/RemoteTestAgent.cs
@@ -72,6 +72,7 @@ namespace NUnit.Util
             return true;
 		}
 
+        [System.Runtime.Remoting.Messaging.OneWay]
         public override void Stop()
 		{
 			log.Info( "Stopping" );
diff --git a/src/ClientUtilities/util/RuntimeFrameworkSelector.cs b/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
index f7c722f..137484b 100644
--- a/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
+++ b/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
@@ -4,6 +4,8 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 using System;
+using System.IO;
+using System.Reflection;
 using NUnit.Core;
 
 namespace NUnit.Util
@@ -43,18 +45,21 @@ namespace NUnit.Util
 
             if (targetVersion == RuntimeFramework.DefaultVersion)
             {
-                foreach (string assembly in package.Assemblies)
-                {
-                    using (AssemblyReader reader = new AssemblyReader(assembly))
+                if (Services.UserSettings.GetSetting("Options.TestLoader.RuntimeSelectionEnabled", true))
+                    foreach (string assembly in package.Assemblies)
                     {
-                        Version v = new Version(reader.ImageRuntimeVersion.Substring(1));
-                        log.Debug("Assembly {0} uses version {1}", assembly, v);
-                        if (v > targetVersion) targetVersion = v;
+                        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;
+                        }
                     }
-                }
+                else
+                    targetVersion = RuntimeFramework.CurrentFramework.ClrVersion;
 
                 RuntimeFramework checkFramework = new RuntimeFramework(targetRuntime, targetVersion);
-                if (!checkFramework.IsAvailable || NUnitConfiguration.GetTestAgentExePath(targetVersion) == null)
+                if (!checkFramework.IsAvailable || !Services.TestAgency.IsRuntimeVersionSupported(targetVersion))
                 {
                     log.Debug("Preferred version {0} is not installed or this NUnit installation does not support it", targetVersion);
                     if (targetVersion < currentFramework.FrameworkVersion)
diff --git a/src/ClientUtilities/util/ServerUtilities.cs b/src/ClientUtilities/util/ServerUtilities.cs
index d0dbc60..7be4fe7 100644
--- a/src/ClientUtilities/util/ServerUtilities.cs
+++ b/src/ClientUtilities/util/ServerUtilities.cs
@@ -96,8 +96,8 @@ namespace NUnit.Util
 					try
 					{
 						channel = CreateTcpChannel( name, port, limit );
-#if NET_2_0
-						ChannelServices.RegisterChannel( channel, false );
+#if CLR_2_0 || CLR_4_0
+                        ChannelServices.RegisterChannel( channel, false );
 #else
 						ChannelServices.RegisterChannel( channel );
 #endif
diff --git a/src/ClientUtilities/util/Services.cs b/src/ClientUtilities/util/Services.cs
index b3267b9..cde8e3a 100644
--- a/src/ClientUtilities/util/Services.cs
+++ b/src/ClientUtilities/util/Services.cs
@@ -80,6 +80,7 @@ namespace NUnit.Util
 		#endregion
 
 		#region RecentFilesService
+#if CLR_2_0 || CLR_4_0
 		private static RecentFiles recentFiles;
 		public static RecentFiles RecentFiles
 		{
@@ -91,9 +92,11 @@ namespace NUnit.Util
 				return recentFiles;
 			}
 		}
+#endif
 		#endregion
 
 		#region TestLoader
+#if CLR_2_0 || CLR_4_0
 		private static TestLoader loader;
 		public static TestLoader TestLoader
 		{
@@ -105,6 +108,7 @@ namespace NUnit.Util
 				return loader;
 			}
 		}
+#endif
 		#endregion
 
 		#region TestAgency
diff --git a/src/ClientUtilities/util/Services/DomainManager.cs b/src/ClientUtilities/util/Services/DomainManager.cs
index 3c86207..292c52b 100644
--- a/src/ClientUtilities/util/Services/DomainManager.cs
+++ b/src/ClientUtilities/util/Services/DomainManager.cs
@@ -16,6 +16,7 @@ using System.Security;
 using System.Security.Permissions;
 using System.Security.Policy;
 using NUnit.Core;
+using System.Security.Principal;
 
 namespace NUnit.Util
 {
@@ -37,7 +38,7 @@ namespace NUnit.Util
 				{
                     shadowCopyPath = Services.UserSettings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
                     if (shadowCopyPath == "")
-                        shadowCopyPath = Path.Combine(Path.GetTempPath(), @"nunit20\ShadowCopyCache");
+                        shadowCopyPath = PathUtils.Combine(Path.GetTempPath(), "nunit20", "ShadowCopyCache");
 					else
 						shadowCopyPath = Environment.ExpandEnvironmentVariables(shadowCopyPath);
 				}
@@ -80,6 +81,10 @@ namespace NUnit.Util
             else if (appBase == null || appBase == string.Empty)
                 appBase = GetCommonAppBase(package.Assemblies);
 
+            char lastChar = appBase[appBase.Length - 1];
+            if (lastChar != Path.DirectorySeparatorChar && lastChar != Path.AltDirectorySeparatorChar)
+                appBase += Path.DirectorySeparatorChar;
+
             setup.ApplicationBase = appBase;
             // TODO: Check whether Mono still needs full path to config file...
             setup.ConfigurationFile = appBase != null && configFile != null
@@ -120,9 +125,9 @@ namespace NUnit.Util
 			
 			// 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)
+            // unexplained crash when unloading the domain.
+#if CLR_2_0 || CLR_4_0
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
 			{
             	PermissionSet permissionSet = new PermissionSet( PermissionState.Unrestricted );	
            		runnerDomain = AppDomain.CreateDomain(domainName, evidence, setup, permissionSet, null);
@@ -131,6 +136,11 @@ namespace NUnit.Util
 #endif
             	runnerDomain = AppDomain.CreateDomain(domainName, evidence, setup);
 
+            // Set PrincipalPolicy for the domain if called for in the settings
+            if ( Services.UserSettings.GetSetting("Options.TestLoader.SetPrincipalPolicy", false ))
+                runnerDomain.SetPrincipalPolicy((PrincipalPolicy)Services.UserSettings.GetSetting(
+                    "Options.TestLoader.PrincipalPolicy", PrincipalPolicy.UnauthenticatedPrincipal));
+
 			// HACK: Only pass down our AddinRegistry one level so that tests of NUnit
 			// itself start without any addins defined.
 			if ( !IsTestDomain( AppDomain.CurrentDomain ) )
@@ -186,7 +196,7 @@ namespace NUnit.Util
                 if (!thread.Join(30000))
                 {
                     log.Error("Unable to unload AppDomain {0}, Unload thread timed out", domainName);
-                    thread.Abort();
+                    ThreadUtility.Kill(thread);
                 }
             }
 
diff --git a/src/ClientUtilities/util/Services/SettingsService.cs b/src/ClientUtilities/util/Services/SettingsService.cs
index c8f5d37..083de61 100644
--- a/src/ClientUtilities/util/Services/SettingsService.cs
+++ b/src/ClientUtilities/util/Services/SettingsService.cs
@@ -25,8 +25,8 @@ namespace NUnit.Util
 		public SettingsService(bool writeable)
 		{
             this.writeable = writeable;
-#if NET_2_0
-			string settingsFile = System.Configuration.ConfigurationManager.AppSettings["settingsFile"];
+#if CLR_2_0 || CLR_4_0
+            string settingsFile = System.Configuration.ConfigurationManager.AppSettings["settingsFile"];
 #else
 			string settingsFile = System.Configuration.ConfigurationSettings.AppSettings["settingsFile"];
 #endif
diff --git a/src/ClientUtilities/util/Services/TestAgency.cs b/src/ClientUtilities/util/Services/TestAgency.cs
index 92f654d..d2a35a2 100644
--- a/src/ClientUtilities/util/Services/TestAgency.cs
+++ b/src/ClientUtilities/util/Services/TestAgency.cs
@@ -10,6 +10,7 @@ using System.Threading;
 using System.Diagnostics;
 using System.Collections;
 using System.Collections.Specialized;
+using System.Reflection;
 using System.Runtime.Remoting;
 using System.Runtime.Remoting.Services;
 using System.Runtime.Remoting.Channels;
@@ -101,6 +102,23 @@ namespace NUnit.Util
 		#endregion
 
 		#region Public Methods - Called by Clients
+
+        /// <summary>
+        /// Returns true if NUnit support for the runtime specified 
+        /// is installed, independent of whether the runtime itself
+        /// is installed on the system.
+        /// 
+        /// In the current implementation, only .NET 1.x requires
+        /// special handling, since all higher runtimes are 
+        /// supported normally.
+        /// </summary>
+        /// <param name="version">The desired runtime version</param>
+        /// <returns>True if NUnit support is installed</returns>
+        public bool IsRuntimeVersionSupported(Version version)
+        {
+            return GetNUnitBinDirectory(version) != null;
+        }
+
 		public TestAgent GetAgent()
 		{
 			return GetAgent( RuntimeFramework.CurrentFramework, Timeout.Infinite );
@@ -159,7 +177,7 @@ namespace NUnit.Util
 		#region Helper Methods
 		private Guid LaunchAgentProcess(RuntimeFramework targetRuntime, bool enableDebug)
 		{
-            string agentExePath = NUnitConfiguration.GetTestAgentExePath(targetRuntime.ClrVersion);
+            string agentExePath = GetTestAgentExePath(targetRuntime.ClrVersion);
 
             if (agentExePath == null)
                 throw new ArgumentException(
@@ -179,10 +197,10 @@ namespace NUnit.Util
             {
                 case RuntimeType.Mono:
                     p.StartInfo.FileName = NUnitConfiguration.MonoExePath;
+                    string monoOptions = "--runtime=v" + targetRuntime.ClrVersion.ToString(3);
                     if (enableDebug)
-                        p.StartInfo.Arguments = string.Format("--debug \"{0}\" {1}", agentExePath, arglist);
-                    else
-                        p.StartInfo.Arguments = string.Format("\"{0}\" {1}", agentExePath, arglist);
+                        monoOptions += " --debug";
+                    p.StartInfo.Arguments = string.Format("{0} \"{1}\" {2}", monoOptions, agentExePath, arglist);
                     break;
                 case RuntimeType.Net:
                     p.StartInfo.FileName = agentExePath;
@@ -253,7 +271,83 @@ namespace NUnit.Util
 
 			return null;
 		}
-		#endregion
+
+        /// <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>
+        private static string GetNUnitBinDirectory(Version v)
+        {
+            // Get current bin directory
+            string dir = NUnitConfiguration.NUnitBinDirectory;
+
+            // Return current directory if current and requested
+            // versions are both >= 2 or both 1
+            if ((Environment.Version.Major >= 2) == (v.Major >= 2))
+                return dir;
+
+            // Check whether special support for version 1 is installed
+            if (v.Major == 1)
+            {
+                string altDir = Path.Combine(dir, "net-1.1");
+                if (Directory.Exists(altDir))
+                    return altDir;
+
+                // The following is only applicable to the dev environment,
+                // which uses parallel build directories. We try to substitute
+                // one version number for another in the path.
+                string[] search = new string[] { "2.0", "3.0", "3.5", "4.0" };
+                string[] replace = v.Minor == 0
+                    ? new string[] { "1.0", "1.1" }
+                    : new string[] { "1.1", "1.0" };
+
+                // 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;
+                    }
+
+                // Try the substitution
+                if (current != null)
+                {
+                    foreach (string target in replace)
+                    {
+                        altDir = dir.Replace(current, target);
+                        if (Directory.Exists(altDir))
+                            return altDir;
+                    }
+                }
+            }
+
+            return null;
+        }
+
+        private static string GetTestAgentExePath(Version v)
+        {
+            string binDir = GetNUnitBinDirectory(v);
+            if (binDir == null) return null;
+
+#if CLR_2_0 || CLR_4_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
 
 		#region IService Members
 
diff --git a/src/ClientUtilities/util/TestDomain.cs b/src/ClientUtilities/util/TestDomain.cs
index 6cc4e17..6915b42 100644
--- a/src/ClientUtilities/util/TestDomain.cs
+++ b/src/ClientUtilities/util/TestDomain.cs
@@ -68,7 +68,11 @@ namespace NUnit.Util
 				if ( this.TestRunner == null )
 					this.TestRunner = this.agent.CreateRunner( this.ID );
 
-                log.Info("Loading tests in AppDomain, see {0}.log", domain.FriendlyName);
+                log.Info(
+                    "Loading tests in AppDomain, see {0}_{1}.log", 
+                    domain.FriendlyName, 
+                    Process.GetCurrentProcess().Id);
+
 				return TestRunner.Load( package );
 			}
 			catch
@@ -105,10 +109,10 @@ namespace NUnit.Util
 		#endregion
 
         #region Running Tests
-        public override void BeginRun(EventListener listener, ITestFilter filter)
+        public override void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
         {
             log.Info("BeginRun in AppDomain {0}", domain.FriendlyName);
-            base.BeginRun(listener, filter);
+            base.BeginRun(listener, filter, tracing, logLevel);
         }
         #endregion
 
diff --git a/src/ClientUtilities/util/TestLabelLevel.cs b/src/ClientUtilities/util/TestLabelLevel.cs
new file mode 100644
index 0000000..4b4627a
--- /dev/null
+++ b/src/ClientUtilities/util/TestLabelLevel.cs
@@ -0,0 +1,15 @@
+// ****************************************************************
+// Copyright 2012, 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.Util
+{
+    public enum TestLabelLevel
+    {
+        Off = 0,
+        On = 1,
+        All = 2,
+    }
+}
diff --git a/src/ClientUtilities/util/TestLoader.cs b/src/ClientUtilities/util/TestLoader.cs
index 56066de..5121078 100644
--- a/src/ClientUtilities/util/TestLoader.cs
+++ b/src/ClientUtilities/util/TestLoader.cs
@@ -1,5 +1,5 @@
 // ****************************************************************
-// Copyright 2002-2008, Charlie Poole
+// Copyright 2002-2011, Charlie Poole
 // This is free software licensed under the NUnit license. You may
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
@@ -59,7 +59,7 @@ namespace NUnit.Util
 		/// <summary>
 		/// The currently loaded test, returned by the testrunner
 		/// </summary>
-		private ITest loadedTest = null;
+        //private ITest loadedTest = null;
 
 		/// <summary>
 		/// The test name that was specified when loading
@@ -97,6 +97,16 @@ namespace NUnit.Util
 		/// </summary>
 		private bool reloadPending = false;
 
+        /// <summary>
+        /// Trace setting to use for running tests
+        /// </summary>
+        private bool tracing;
+
+        /// <summary>
+        /// LoggingThreshold to use for running tests
+        /// </summary>
+        private LoggingThreshold logLevel;
+
 		/// <summary>
 		/// The last filter used for a run - used to 
 		/// rerun tests when a change occurs
@@ -104,6 +114,16 @@ namespace NUnit.Util
 		private ITestFilter lastFilter;
 
         /// <summary>
+        /// The last trace setting used for a run
+        /// </summary>
+        private bool lastTracing;
+
+        /// <summary>
+        /// Last logging level used for a run
+        /// </summary>
+        private LoggingThreshold lastLogLevel;
+
+        /// <summary>
         /// The runtime framework being used for the currently
         /// loaded tests, or the current framework if no tests
         /// are loaded.
@@ -141,9 +161,14 @@ namespace NUnit.Util
 
 		public bool IsTestLoaded
 		{
-			get { return loadedTest != null; }
+			get { return testRunner != null && testRunner.Test != null; }
 		}
 
+        public ITest LoadedTest
+        {
+            get { return testRunner == null ? null : testRunner.Test; }
+        }
+
 		public bool Running
 		{
 			get { return testRunner != null && testRunner.Running; }
@@ -176,18 +201,31 @@ namespace NUnit.Util
 
 		public IList AssemblyInfo
 		{
-			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
+			get { return testRunner == null ? new TestAssemblyInfo[0] : testRunner.AssemblyInfo; }
 		}
 
 		public int TestCount
 		{
-			get { return loadedTest == null ? 0 : loadedTest.TestCount; }
+			get { return LoadedTest == null ? 0 : LoadedTest.TestCount; }
 		}
 
         public RuntimeFramework CurrentFramework
         {
             get { return currentFramework; }
         }
+
+        public bool IsTracingEnabled
+        {
+            get { return tracing; }
+            set { tracing = value; }
+        }
+
+        public LoggingThreshold LoggingThreshold
+        {
+            get { return logLevel; }
+            set { logLevel = value; }
+        }
+
 		#endregion
 
 		#region EventListener Handlers
@@ -202,17 +240,7 @@ namespace NUnit.Util
 		{
 			this.testResult = testResult;
 
-			try
-			{
-				this.SaveLastResult( 
-					Path.Combine( Path.GetDirectoryName( this.TestFileName ), "TestResult.xml" ) );
-				events.FireRunFinished( testResult );
-			}
-			catch( Exception ex )
-			{
-				this.lastException = ex;
-				events.FireRunFinished( ex );
-			}
+            events.FireRunFinished(testResult);
 		}
 
 		public void RunFinished(Exception exception)
@@ -465,7 +493,6 @@ namespace NUnit.Util
 
                 bool loaded = testRunner.Load(package);
 
-				loadedTest = testRunner.Test;
 				loadedTestName = testName;
 				testResult = null;
 				reloadPending = false;
@@ -480,7 +507,7 @@ namespace NUnit.Util
                         : RuntimeFramework.CurrentFramework;
 
                     testProject.HasChangesRequiringReload = false;
-                    events.FireTestLoaded(TestFileName, loadedTest);
+                    events.FireTestLoaded(TestFileName, LoadedTest);
                 }
                 else
                 {
@@ -539,7 +566,6 @@ namespace NUnit.Util
                     testRunner.Dispose();
 					testRunner = null;
 
-					loadedTest = null;
 					loadedTestName = null;
 					testResult = null;
 					reloadPending = false;
@@ -556,6 +582,25 @@ namespace NUnit.Util
 			}
 		}
 
+        /// <summary>
+        /// Return true if the current project can be reloaded under
+        /// the specified CLR version.
+        /// </summary>
+        public bool CanReloadUnderRuntimeVersion(Version version)
+        {
+            if (!Services.TestAgency.IsRuntimeVersionSupported(version))
+                return false;
+
+            if (AssemblyInfo.Count == 0)
+                return false;
+
+            foreach (TestAssemblyInfo info in AssemblyInfo)
+                if (info == null || info.ImageRuntimeVersion > version)
+                    return false;
+
+            return true;
+        }
+
 		/// <summary>
 		/// Reload the current test on command
 		/// </summary>
@@ -584,7 +629,6 @@ namespace NUnit.Util
                         ? package.Settings["RuntimeFramework"] as RuntimeFramework
                         : RuntimeFramework.CurrentFramework;
 
-                loadedTest = testRunner.Test;
                 currentRuntime = framework;
 				reloadPending = false;
 
@@ -592,7 +636,7 @@ namespace NUnit.Util
                     InstallWatcher();
 
                 testProject.HasChangesRequiringReload = false;
-                events.FireTestReloaded(TestFileName, loadedTest);
+                events.FireTestReloaded(TestFileName, LoadedTest);
 
                 log.Info("Reload complete");
 			}
@@ -627,19 +671,12 @@ namespace NUnit.Util
 				ReloadTest();
 
                 if (lastFilter != null && Services.UserSettings.GetSetting("Options.TestLoader.RerunOnChange", false))
-					testRunner.BeginRun( this, lastFilter );
+					testRunner.BeginRun( this, lastFilter, lastTracing, lastLogLevel );
 			}
 		}
 		#endregion
 
 		#region Methods for Running Tests
-		/// <summary>
-		/// Run all the tests
-		/// </summary>
-		public void RunTests()
-		{
-			RunTests( TestFilter.Empty );
-		}
 
 		/// <summary>
 		/// Run selected tests using a filter
@@ -647,13 +684,17 @@ namespace NUnit.Util
 		/// <param name="filter">The filter to be used</param>
 		public void RunTests( ITestFilter filter )
 		{
-			if ( !Running )
+			if ( !Running  && LoadedTest != null)
 			{
                 if (reloadPending || Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false))
 					ReloadTest();
 
-				this.lastFilter = filter;
-				testRunner.BeginRun( this, filter );
+                // Save args for automatic rerun
+                this.lastFilter = filter;
+                this.lastTracing = tracing;
+                this.lastLogLevel = logLevel;
+
+                testRunner.BeginRun(this, filter, tracing, logLevel);
 			}
 		}
 
@@ -671,7 +712,7 @@ namespace NUnit.Util
 		public IList GetCategories() 
 		{
 			CategoryManager categoryManager = new CategoryManager();
-			categoryManager.AddAllCategories( this.loadedTest );
+			categoryManager.AddAllCategories( this.LoadedTest );
 			ArrayList list = new ArrayList( categoryManager.Categories );
 			list.Sort();
 			return list;
@@ -720,21 +761,38 @@ namespace NUnit.Util
 			TestPackage package = TestProject.ActiveConfig.MakeTestPackage();
 			package.TestName = testName;
 
-            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);
+            ISettings userSettings = Services.UserSettings;
+            package.Settings["MergeAssemblies"] = userSettings.GetSetting("Options.TestLoader.MergeAssemblies", false);
+            package.Settings["AutoNamespaceSuites"] = userSettings.GetSetting("Options.TestLoader.AutoNamespaceSuites", true);
+            package.Settings["ShadowCopyFiles"] = userSettings.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);
+            ProcessModel processModel = (ProcessModel)userSettings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
+            DomainUsage domainUsage = (DomainUsage)userSettings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
 
-            if (processModel != ProcessModel.Default && !package.Settings.Contains("ProcessModel"))
+            if (processModel != ProcessModel.Default &&     // Ignore default setting
+                !package.Settings.Contains("ProcessModel")) // Ignore global setting if package has a setting
+            {
                 package.Settings["ProcessModel"] = processModel;
+            }
 
-            if (processModel != ProcessModel.Multiple && domainUsage == DomainUsage.Multiple
-                    && !package.Settings.Contains("DomainUsage"))
+            // NOTE: This code ignores DomainUsage.None because TestLoader
+            // is only called from the GUI and the GUI can't support that setting.
+            // TODO: Move this logic to the GUI if TestLoader is used more widely
+            if (domainUsage != DomainUsage.Default &&       // Ignore default setting
+                domainUsage != DomainUsage.None &&          // Ignore DomainUsage.None in Gui
+                (processModel != ProcessModel.Multiple ||
+                    domainUsage != DomainUsage.Multiple) && // Both process and domain may not be multiple
+                !package.Settings.Contains("DomainUsage"))  // Ignore global setting if package has a setting
+            {
                 package.Settings["DomainUsage"] = domainUsage;
-			
+            }
+
+            if (!package.Settings.Contains("WorkDirectory"))
+                package.Settings["WorkDirectory"] = Environment.CurrentDirectory;
+
+            //if (NUnitConfiguration.ApartmentState != System.Threading.ApartmentState.Unknown)
+            //    package.Settings["ApartmentState"] = NUnitConfiguration.ApartmentState;
+
             return package;
 		}
 		#endregion
diff --git a/src/ClientUtilities/util/VSProject.cs b/src/ClientUtilities/util/VSProject.cs
index 2a8241d..bb62174 100644
--- a/src/ClientUtilities/util/VSProject.cs
+++ b/src/ClientUtilities/util/VSProject.cs
@@ -89,8 +89,8 @@ namespace NUnit.Util
 		#region Static Methods
 
 		public static bool IsProjectFile( string path )
-		{
-#if NET_2_0
+        {
+#if CLR_2_0 || CLR_4_0
             if (path.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
 #else
 			if ( path.IndexOfAny( Path.InvalidPathChars ) >= 0 )
@@ -267,24 +267,45 @@ namespace NUnit.Util
 			else
 				assemblyName = assemblyName + ".dll";
 
+            string commonOutputPath = null;
+
 			foreach (XmlElement configNode in nodes)
 			{
                 if (configNode.Name != "PropertyGroup")
                     continue;
 
+                string configurationName = null;
 				XmlAttribute conditionAttribute = configNode.Attributes["Condition"];
-				if (conditionAttribute == null) continue;
+                if (conditionAttribute != null)
+                {
+                    string condition = conditionAttribute.Value;
+                    if (condition.IndexOf("$(Configuration)") >= 0)
+                    {
+                        int start = condition.IndexOf("==");
+                        if (start >= 0)
+                        {
+                            configurationName = condition.Substring(start + 2).Trim(new char[] { ' ', '\'' });
+                            if (configurationName.EndsWith("|AnyCPU"))
+                                configurationName = configurationName.Substring(0, configurationName.Length - 7);
+                        }
+                    }
+                }
+
+				XmlElement outputPathElement = (XmlElement)configNode.SelectSingleNode("msbuild:OutputPath", namespaceManager);
+                string outputPath = null;
+				if (outputPathElement != null)
+                    outputPath = outputPathElement.InnerText;
 
-				string condition = conditionAttribute.Value;
-				int start = condition.IndexOf( "==" );
-				if ( start < 0 ) continue;
+                if (configurationName == null)
+                {
+                    commonOutputPath = outputPath;
+                    continue;
+                }
 
-				string configurationName = condition.Substring( start + 2 ).Trim(new char[] {' ', '\'' } );
-				if ( configurationName.EndsWith( "|AnyCPU" ) )
-					configurationName = configurationName.Substring( 0, configurationName.Length - 7 );
+                if (outputPath == null)
+                    outputPath = commonOutputPath;
 
-				XmlElement outputPathElement = (XmlElement)configNode.SelectSingleNode("msbuild:OutputPath", namespaceManager);
-				string outputPath = outputPathElement.InnerText;
+                if (outputPath == null) continue;
 
 				string outputDirectory = Path.Combine(projectDirectory, outputPath);
 				string assemblyPath = Path.Combine(outputDirectory, assemblyName);
diff --git a/src/ClientUtilities/util/XmlResultTransform.cs b/src/ClientUtilities/util/XmlResultTransform.cs
index 80def0e..aa850af 100644
--- a/src/ClientUtilities/util/XmlResultTransform.cs
+++ b/src/ClientUtilities/util/XmlResultTransform.cs
@@ -16,9 +16,9 @@ namespace NUnit.Util
 	/// Summary description for XmlResultTransform.
 	/// </summary>
 	public class XmlResultTransform
-	{
-#if NET_2_0
-		private XslCompiledTransform xslTransform = new XslCompiledTransform();
+    {
+#if CLR_2_0 || CLR_4_0
+        private XslCompiledTransform xslTransform = new XslCompiledTransform();
 #else
         private XslTransform xslTransform = new XslTransform();
 #endif
diff --git a/src/ClientUtilities/util/nunit.util.build b/src/ClientUtilities/util/nunit.util.build
index abbeb79..32286cb 100644
--- a/src/ClientUtilities/util/nunit.util.build
+++ b/src/ClientUtilities/util/nunit.util.build
@@ -2,68 +2,71 @@
 <project name="NUnitUtil" default="build" basedir=".">
 
   <patternset id="source-files">
-        <include name="AggregatingTestRunner.cs"/>
-        <include name="AssemblyInfo.cs"/>
-        <include name="AssemblyList.cs"/>
-        <include name="AssemblyWatcher.cs"/>
-        <include name="CategoryExpression.cs"/>
-        <include name="CategoryManager.cs"/>
-        <include name="CommandLineOptions.cs"/>
-        <include name="ConsoleWriter.cs"/>
-        <include name="DefaultTestRunnerFactory.cs"/>
-        <include name="IAssemblyWatcher.cs"/>
-        <include name="InProcessTestRunnerFactory.cs"/>
-        <include name="MemorySettingsStorage.cs"/>
-        <include name="NUnitProject.cs"/>
-        <include name="NUnitRegistry.cs"/>
-        <include name="PathUtils.cs"/>
-        <include name="ProcessRunner.cs"/>
-        <include name="ProjectConfig.cs"/>
-        <include name="ProjectConfigCollection.cs"/>
-        <include name="ProjectFormatException.cs"/>
-        <include name="RecentFileEntry.cs"/>
-        <include name="RecentFiles.cs"/>
-        <include name="RecentFilesCollection.cs"/>
-        <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="TestDomain.cs"/>
-        <include name="TestEventArgs.cs"/>
-        <include name="TestEventDispatcher.cs"/>
-        <include name="TestExceptionHandler.cs"/>
-        <include name="TestLoader.cs"/>
-        <include name="TestObserver.cs"/>
-        <include name="TestResultItem.cs"/>
-        <include name="TestServer.cs"/>
-        <include name="VSProject.cs"/>
-        <include name="VSProjectConfig.cs"/>
-        <include name="VSProjectConfigCollection.cs"/>
-        <include name="XmlResultTransform.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="AggregatingTestRunner.cs"/>
+    <include name="AssemblyInfo.cs"/>
+    <include name="AssemblyList.cs"/>
+    <include name="AssemblyWatcher.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="CategoryExpression.cs"/>
+    <include name="CategoryManager.cs"/>
+    <include name="CommandLineOptions.cs"/>
+    <include name="ConsoleWriter.cs"/>
+    <include name="DefaultTestRunnerFactory.cs"/>
+    <include name="FileWatcher.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="Guard.cs"/>
+    <include name="IAssemblyWatcher.cs"/>
+    <include name="InProcessTestRunnerFactory.cs"/>
+    <include name="MemorySettingsStorage.cs"/>
+    <include name="NUnitProject.cs"/>
+    <include name="NUnitRegistry.cs"/>
+    <include name="PathUtils.cs"/>
+    <include name="ProcessRunner.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="ProjectConfig.cs"/>
+    <include name="ProjectConfigCollection.cs"/>
+    <include name="ProjectFormatException.cs"/>
+    <include name="RecentFileEntry.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="RecentFiles.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="RecentFilesCollection.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="RegistrySettingsStorage.cs"/>
+    <include name="RemoteTestAgent.cs"/>
+    <include name="ResultSummarizer.cs"/>
+    <include name="RuntimeFrameworkSelector.cs" if="${runtime.version >= '2.0'}"/>
+    <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="TestDomain.cs"/>
+    <include name="TestEventArgs.cs"/>
+    <include name="TestEventDispatcher.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestExceptionHandler.cs"/>
+    <include name="TestLabelLevel.cs"/>
+    <include name="TestLoader.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestObserver.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestResultItem.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="TestServer.cs"/>
+    <include name="VSProject.cs"/>
+    <include name="VSProjectConfig.cs"/>
+    <include name="VSProjectConfigCollection.cs"/>
+    <include name="XmlResultTransform.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" if="${runtime.version >= '2.0'}"/>
+    <include name="Interfaces/ITestLoader.cs" if="${runtime.version >= '2.0'}"/>
+    <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" if="${runtime.version >= '2.0'}"/>
+    <include name="Services/ServiceManager.cs"/>
+    <include name="Services/SettingsService.cs"/>
+    <include name="Services/TestAgency.cs"/>
   </patternset>
 
   <patternset id="resource-files">
diff --git a/src/ClientUtilities/util/nunit.util.dll.csproj b/src/ClientUtilities/util/nunit.util.dll.csproj
index 4242c3a..66950a3 100644
--- a/src/ClientUtilities/util/nunit.util.dll.csproj
+++ b/src/ClientUtilities/util/nunit.util.dll.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{61CE9CE5-943E-44D4-A381-814DC1406767}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;CLR_2_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -47,7 +47,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;NET_2_0;CLR_2_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -94,7 +94,8 @@
     <Compile Include="AggregatingTestRunner.cs" />
     <Compile Include="AssemblyInfo.cs" />
     <Compile Include="AssemblyList.cs" />
-    <Compile Include="AssemblyWatcher.cs" />
+    <Compile Include="AssemblyWatcher.cs">
+    </Compile>
     <Compile Include="CategoryExpression.cs" />
     <Compile Include="CategoryManager.cs" />
     <Compile Include="CommandLineOptions.cs" />
@@ -102,6 +103,9 @@
     <Compile Include="DefaultTestRunnerFactory.cs" />
     <Compile Include="Extensibility\IProjectConverter.cs" />
     <Compile Include="Extensibility\ProjectConverterCollection.cs" />
+    <Compile Include="FileWatcher.cs">
+    </Compile>
+    <Compile Include="Guard.cs" />
     <Compile Include="IAssemblyWatcher.cs" />
     <Compile Include="InProcessTestRunnerFactory.cs" />
     <Compile Include="Interfaces\IRuntimeFrameworkSelector.cs" />
@@ -143,6 +147,7 @@
     <Compile Include="TestEventArgs.cs" />
     <Compile Include="TestEventDispatcher.cs" />
     <Compile Include="TestExceptionHandler.cs" />
+    <Compile Include="TestLabelLevel.cs" />
     <Compile Include="TestLoader.cs" />
     <Compile Include="TestObserver.cs" />
     <Compile Include="TestResultItem.cs" />
diff --git a/src/CommonAssemblyInfo.cs b/src/CommonAssemblyInfo.cs
index 1a4d62d..ebc62e5 100644
--- a/src/CommonAssemblyInfo.cs
+++ b/src/CommonAssemblyInfo.cs
@@ -16,7 +16,7 @@ using System.Reflection;
 //
 [assembly: AssemblyCompany("NUnit.org")]
 [assembly: AssemblyProduct("NUnit")]
-[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: AssemblyCopyright("Copyright (C) 2002-2012 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")]
 
 //
@@ -30,5 +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.5.10")]
-[assembly: AssemblyInformationalVersion("2.5.10")]
+[assembly: AssemblyVersion("2.6.0")]
+[assembly: AssemblyInformationalVersion("2.6.0")]
diff --git a/src/ConsoleRunner/nunit-console-exe/App.config b/src/ConsoleRunner/nunit-console-exe/App.config
index ce92b5b..3a2afb3 100644
--- a/src/ConsoleRunner/nunit-console-exe/App.config
+++ b/src/ConsoleRunner/nunit-console-exe/App.config
@@ -1,69 +1,31 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
+  <!--
+   The .NET 2.0 build of the console runner only 
+   runs under .NET 2.0 or higher. The setting
+   useLegacyV2RuntimeActivationPolicy only applies 
+   under .NET 4.0 and permits use of mixed mode 
+   assemblies, which would otherwise not load 
+   correctly.
+  -->
+  <startup useLegacyV2RuntimeActivationPolicy="true">
+    <!-- Comment out the next line to force use of .NET 4.0 -->
+    <supportedRuntime version="v2.0.50727" />
+    <supportedRuntime version="v4.0.30319" />
+  </startup>
 
   <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
+    <!-- Ensure that test exceptions don't crash NUnit -->
     <legacyUnhandledExceptionPolicy enabled="1" />
 
+    <!-- Run partial trust V2 assemblies in full trust under .NET 4.0 -->
+    <loadFromRemoteSources enabled="true" />
+
     <!-- 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/App.v1.config b/src/ConsoleRunner/nunit-console-exe/App.v1.config
new file mode 100644
index 0000000..09e2a8f
--- /dev/null
+++ b/src/ConsoleRunner/nunit-console-exe/App.v1.config
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <!--
+   The .NET 1.1 build of the console runner  
+   runs under .NET 1.0 or 1.1.
+  -->
+  <startup>
+    <supportedRuntime version="v1.1.4322" />
+    <supportedRuntime version="v1.0.3705" />
+  </startup>
+
+  <runtime>
+    <!-- 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/Ship.config b/src/ConsoleRunner/nunit-console-exe/Ship.config
deleted file mode 100644
index ce92b5b..0000000
--- a/src/ConsoleRunner/nunit-console-exe/Ship.config
+++ /dev/null
@@ -1,69 +0,0 @@
-<?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/nunit-console.exe.build b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
index 846f320..2e6222e 100644
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
+++ b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
@@ -21,13 +21,15 @@
       </references>
     </csc>
 
-    <copy file="Ship.config"
+    <copy file="App.config" if="${runtime.version >= '2.0'}"
+      tofile="${current.build.dir}/nunit-console.exe.config"/>
+    <copy file="App.v1.config" unless="${runtime.version >= '2.0'}"
       tofile="${current.build.dir}/nunit-console.exe.config"/>
 
     <csc target="exe" 
         output="${current.build.dir}/nunit-console-x86.exe"
         debug="${build.debug}" define="${build.defines}"
-        platform="x86" if="${build.x86}">
+        platform="x86" if="${runtime.version >= '2.0'}">
       <sources>
         <patternset refid="source-files"/>
         <include name="../../GeneratedAssemblyInfo.cs"/>
@@ -39,7 +41,7 @@
       </references>
     </csc>
 
-    <copy file="Ship.config" if="${build.x86}"
+    <copy file="App.config" if="${runtime.version >= '2.0'}"
       tofile="${current.build.dir}/nunit-console-x86.exe.config"/>
   </target>
 
@@ -48,7 +50,7 @@
       <fileset>
         <patternset refid="source-files"/>
         <include name="App.config"/>
-        <include name="Ship.config"/>
+        <include name="App.v1.config"/>
         <include name="App.ico"/>
         <include name="nunit-console.exe.csproj"/>
         <include name="nunit-console.exe.build"/>
diff --git a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
index 5b65d17..aca663c 100644
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
+++ b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -30,7 +30,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -49,7 +49,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
diff --git a/src/ConsoleRunner/nunit-console/ConsoleOptions.cs b/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
index e4a16b8..b692fcb 100644
--- a/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
+++ b/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
@@ -19,21 +19,30 @@ namespace NUnit.ConsoleRunner
 		[Option(Description = "Name of the test case(s), fixture(s) or namespace(s) to run")]
 		public string run;
 
+        [Option(Description = "Name of a file containing a list of the tests to run")]
+        public string runlist;
+
 		[Option(Description = "Project configuration (e.g.: Debug) to load")]
 		public string config;
 
-		[Option(Description = "Name of XML output file (Default: TestResult.xml)")]
-		public string xml;
+		[Option(Short="xml", Description = "Name of XML result file (Default: TestResult.xml)")]
+		public string result;
 
 		[Option(Description = "Display XML to the console (Deprecated)")]
 		public bool xmlConsole;
 
+        [Option(Short="noxml", Description = "Suppress XML result output")]
+        public bool noresult;
+
 		[Option(Short="out", Description = "File to receive test output")]
 		public string output;
 
 		[Option(Description = "File to receive test error output")]
 		public string err;
 
+        [Option(Description = "Work directory for output files")]
+        public string work;
+
 		[Option(Description = "Label each test in stdOut")]
 		public bool labels = false;
 
@@ -46,16 +55,21 @@ namespace NUnit.ConsoleRunner
 		[Option(Description = "List of categories to exclude")]
 		public string exclude;
 
-		[Option(Description = "Process model for tests: Single, Separate, Multiple")]
+#if CLR_2_0 || CLR_4_0
+        [Option(Description = "Framework version to be used for tests")]
+        public string framework;
+
+        [Option(Description = "Process model for tests: Single, Separate, Multiple")]
 		public ProcessModel process;
+#endif
 
 		[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 = "Apartment for running tests: MTA (Default), STA")]
+        public System.Threading.ApartmentState apartment;
 
-		[Option(Description = "Disable shadow copy when running in separate domain")]
+        [Option(Description = "Disable shadow copy when running in separate domain")]
 		public bool noshadow;
 
 		[Option (Description = "Disable use of a separate thread for tests")]
@@ -73,7 +87,13 @@ namespace NUnit.ConsoleRunner
 		[Option(Description = "Do not display progress" )]
 		public bool nodots = false;
 
-		[Option(Short="?", Description = "Display help")]
+        [Option(Description = "Stop after the first test failure or error")]
+        public bool stoponerror = false;
+
+        [Option(Description = "Erase any leftover cache files and exit")]
+        public bool cleanup;
+
+        [Option(Short = "?", Description = "Display help")]
 		public bool help = false;
 
 		public ConsoleOptions( params string[] args ) : base( args ) {}
diff --git a/src/ConsoleRunner/nunit-console/ConsoleUi.cs b/src/ConsoleRunner/nunit-console/ConsoleUi.cs
index 8dd1c92..cf25140 100644
--- a/src/ConsoleRunner/nunit-console/ConsoleUi.cs
+++ b/src/ConsoleRunner/nunit-console/ConsoleUi.cs
@@ -27,17 +27,29 @@ namespace NUnit.ConsoleRunner
 		public static readonly int FIXTURE_NOT_FOUND = -3;
 		public static readonly int UNEXPECTED_ERROR = -100;
 
+        private string workDir;
+
 		public ConsoleUi()
 		{
 		}
 
 		public int Execute( ConsoleOptions options )
 		{
+            this.workDir = options.work;
+            if (workDir == null || workDir == string.Empty)
+                workDir = Environment.CurrentDirectory;
+            else
+            {
+                workDir = Path.GetFullPath(workDir);
+                if (!Directory.Exists(workDir))
+                    Directory.CreateDirectory(workDir);
+            }
+
 			TextWriter outWriter = Console.Out;
 			bool redirectOutput = options.output != null && options.output != string.Empty;
 			if ( redirectOutput )
 			{
-				StreamWriter outStreamWriter = new StreamWriter( options.output );
+				StreamWriter outStreamWriter = new StreamWriter( Path.Combine(workDir, options.output) );
 				outStreamWriter.AutoFlush = true;
 				outWriter = outStreamWriter;
 			}
@@ -46,25 +58,38 @@ namespace NUnit.ConsoleRunner
 			bool redirectError = options.err != null && options.err != string.Empty;
 			if ( redirectError )
 			{
-				StreamWriter errorStreamWriter = new StreamWriter( options.err );
+				StreamWriter errorStreamWriter = new StreamWriter( Path.Combine(workDir, options.err) );
 				errorStreamWriter.AutoFlush = true;
 				errorWriter = errorStreamWriter;
 			}
 
             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");
+            ProcessModel processModel = package.Settings.Contains("ProcessModel")
+                ? (ProcessModel)package.Settings["ProcessModel"]
+                : ProcessModel.Default;
+
+            DomainUsage domainUsage = package.Settings.Contains("DomainUsage")
+                ? (DomainUsage)package.Settings["DomainUsage"]
+                : DomainUsage.Default;
+
+            RuntimeFramework framework = package.Settings.Contains("RuntimeFramework")
+                ? (RuntimeFramework)package.Settings["RuntimeFramework"]
+                : RuntimeFramework.CurrentFramework;
+
+#if CLR_2_0 || CLR_4_0
+            Console.WriteLine("ProcessModel: {0}    DomainUsage: {1}", processModel, domainUsage);
+
+            Console.WriteLine("Execution Runtime: {0}", framework);
+#else
+            Console.WriteLine("DomainUsage: {0}", domainUsage);
 
-            Console.WriteLine("Execution Runtime: {0}", 
-                package.Settings.Contains("RuntimeFramework")
-                    ? package.Settings["RuntimeFramework"]
-                    : "Default");
+            if (processModel != ProcessModel.Default && processModel != ProcessModel.Single)
+                Console.WriteLine("Warning: Ignoring project setting 'processModel={0}'", processModel);
+
+            if (!RuntimeFramework.CurrentFramework.Supports(framework))
+                Console.WriteLine("Warning: Ignoring project setting 'runtimeFramework={0}'", framework);
+#endif
 
             using (TestRunner testRunner = new DefaultTestRunnerFactory().MakeTestRunner(package))
 			{
@@ -80,17 +105,40 @@ namespace NUnit.ConsoleRunner
 				EventCollector collector = new EventCollector( options, outWriter, errorWriter );
 
 				TestFilter testFilter = TestFilter.Empty;
+                SimpleNameFilter nameFilter = new SimpleNameFilter();
+
 				if ( options.run != null && options.run != string.Empty )
 				{
 					Console.WriteLine( "Selected test(s): " + options.run );
-					testFilter = new SimpleNameFilter( TestNameParser.Parse(options.run) );
+                    foreach (string name in TestNameParser.Parse(options.run))
+                        nameFilter.Add(name);
+                    testFilter = nameFilter;
 				}
 
+                if (options.runlist != null && options.runlist != string.Empty)
+                {
+                    Console.WriteLine("Run list: " + options.runlist);
+                    using (StreamReader rdr = new StreamReader(options.runlist))
+                    {
+                        // NOTE: We can't use rdr.EndOfStream because it's
+                        // not present in .NET 1.x.
+                        string line = rdr.ReadLine();
+                        while (line != null)
+                        {
+                            if (line[0] != '#')
+                                nameFilter.Add(line);
+                            line = rdr.ReadLine();
+                        }
+                    }
+                    testFilter = nameFilter;
+                }
+
 				if ( options.include != null && options.include != string.Empty )
 				{
-					Console.WriteLine( "Included categories: " + options.include );
 					TestFilter includeFilter = new CategoryExpression( options.include ).Filter;
-					if ( testFilter.IsEmpty )
+                    Console.WriteLine("Included categories: " + includeFilter.ToString());
+
+                    if (testFilter.IsEmpty)
 						testFilter = includeFilter;
 					else
 						testFilter = new AndFilter( testFilter, includeFilter );
@@ -98,8 +146,9 @@ namespace NUnit.ConsoleRunner
 
 				if ( options.exclude != null && options.exclude != string.Empty )
 				{
-					Console.WriteLine( "Excluded categories: " + options.exclude );
 					TestFilter excludeFilter = new NotFilter( new CategoryExpression( options.exclude ).Filter );
+                    Console.WriteLine("Excluded categories: " + excludeFilter.ToString());
+
 					if ( testFilter.IsEmpty )
 						testFilter = excludeFilter;
 					else if ( testFilter is AndFilter )
@@ -118,7 +167,7 @@ namespace NUnit.ConsoleRunner
 
 				try
 				{
-					result = testRunner.Run( collector, testFilter );
+					result = testRunner.Run( collector, testFilter, false, LoggingThreshold.Off );
 				}
 				finally
 				{
@@ -152,18 +201,29 @@ namespace NUnit.ConsoleRunner
                     {
                         WriteSummaryReport(summary);
                         if (summary.ErrorsAndFailures > 0 || result.IsError || result.IsFailure)
+                        {
+                            if (options.stoponerror)
+                            {
+                                Console.WriteLine("Test run was stopped after first error, as requested.");
+                                Console.WriteLine();
+                            }
+
                             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);
+                        if (!options.noresult)
+                        {
+                            // Write xml output here
+                            string xmlResultFile = options.result == null || options.result == string.Empty
+                                ? "TestResult.xml" : options.result;
+
+                            using (StreamWriter writer = new StreamWriter(Path.Combine(workDir, xmlResultFile)))
+                            {
+                                writer.Write(xmlOutput);
+                            }
+                        }
                     }
 
                     returnCode = summary.ErrorsAndFailures;
@@ -181,7 +241,7 @@ namespace NUnit.ConsoleRunner
 
 		#region Helper Methods
         // TODO: See if this can be unified with the Gui's MakeTestPackage
-        private static TestPackage MakeTestPackage( ConsoleOptions options )
+        private TestPackage MakeTestPackage( ConsoleOptions options )
         {
 			TestPackage package;
 			DomainUsage domainUsage = DomainUsage.Default;
@@ -219,15 +279,17 @@ namespace NUnit.ConsoleRunner
 				domainUsage = DomainUsage.Multiple;
 			}
 
+#if CLR_2_0 || CLR_4_0
+            if (options.framework != null)
+                framework = RuntimeFramework.Parse(options.framework);
+
             if (options.process != ProcessModel.Default)
                 processModel = options.process;
+#endif
 
 			if (options.domain != DomainUsage.Default)
 				domainUsage = options.domain;
 
-            if (options.framework != null)
-                framework = RuntimeFramework.Parse(options.framework);
-
 			package.TestName = options.fixture;
             
             package.Settings["ProcessModel"] = processModel;
@@ -246,6 +308,11 @@ namespace NUnit.ConsoleRunner
             package.Settings["ShadowCopyFiles"] = !options.noshadow;
 			package.Settings["UseThreadedRunner"] = !options.nothread;
             package.Settings["DefaultTimeout"] = options.timeout;
+            package.Settings["WorkDirectory"] = this.workDir;
+            package.Settings["StopOnError"] = options.stoponerror;
+
+            if (options.apartment != System.Threading.ApartmentState.Unknown)
+                package.Settings["ApartmentState"] = options.apartment;
 
             return package;
 		}
diff --git a/src/ConsoleRunner/nunit-console/Runner.cs b/src/ConsoleRunner/nunit-console/Runner.cs
index 29c3d7e..2bba447 100644
--- a/src/ConsoleRunner/nunit-console/Runner.cs
+++ b/src/ConsoleRunner/nunit-console/Runner.cs
@@ -42,8 +42,16 @@ namespace NUnit.ConsoleRunner
 				options.Help();
 				return ConsoleUi.OK;
 			}
-			
-			if(options.NoArgs) 
+
+            if (options.cleanup)
+            {
+                log.Info("Performing cleanup of shadow copy cache");
+                DomainManager.DeleteShadowCopyPath();
+                Console.WriteLine("Shadow copy cache emptied");
+                return ConsoleUi.OK;
+            }
+
+            if (options.NoArgs) 
 			{
 				Console.Error.WriteLine("fatal error: no inputs specified");
 				options.Help();
@@ -113,14 +121,20 @@ namespace NUnit.ConsoleRunner
 			Assembly executingAssembly = Assembly.GetExecutingAssembly();
 			string versionText = executingAssembly.GetName().Version.ToString();
 
-			string productName = "NUnit";
-			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.";
+#if CLR_1_0
+            string productName = "NUnit-Console (.NET 1.0)";
+#elif CLR_1_1
+            string productName = "NUnit-Console (.NET 1.1)";
+#else
+            string productName = "NUnit-Console";
+#endif
+            string copyrightText = "Copyright (C) 2002-2012 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 )
-				productName = ((AssemblyProductAttribute)objectAttrs[0]).Product;
+            //object[] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+            //if ( objectAttrs.Length > 0 )
+            //    productName = ((AssemblyProductAttribute)objectAttrs[0]).Product;
 
-			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+			object[] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
 			if ( objectAttrs.Length > 0 )
 				copyrightText = ((AssemblyCopyrightAttribute)objectAttrs[0]).Copyright;
 
diff --git a/src/ConsoleRunner/nunit-console/nunit-console.csproj b/src/ConsoleRunner/nunit-console/nunit-console.csproj
index 6528791..5dcd5c0 100644
--- a/src/ConsoleRunner/nunit-console/nunit-console.csproj
+++ b/src/ConsoleRunner/nunit-console/nunit-console.csproj
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -47,7 +47,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
diff --git a/src/ConsoleRunner/tests/CommandLineTests.cs b/src/ConsoleRunner/tests/CommandLineTests.cs
index 1b0c4e7..a7804a6 100644
--- a/src/ConsoleRunner/tests/CommandLineTests.cs
+++ b/src/ConsoleRunner/tests/CommandLineTests.cs
@@ -28,12 +28,15 @@ namespace NUnit.ConsoleRunner.Tests
 			Assert.AreEqual( Path.DirectorySeparatorChar != '/', options.AllowForwardSlash );
 		}
 
-		private void TestBooleanOption( string fieldName )
-		{
-			TestBooleanOption( fieldName, fieldName );
-		}
-
-		private void TestBooleanOption( string fieldName, string option )
+		[TestCase( "nologo", "nologo")]
+		[TestCase( "help", "help" )]
+		[TestCase( "help", "?" )]
+		[TestCase( "wait", "wait" )]
+		[TestCase( "xmlConsole", "xmlConsole")]
+		[TestCase( "labels", "labels")]
+		[TestCase( "noshadow", "noshadow" )]
+		[TestCase( "nothread", "nothread" )]
+		public void BooleanOptionAreRecognized( string fieldName, string option )
 		{
 			FieldInfo field = typeof(ConsoleOptions).GetField( fieldName );
 			Assert.IsNotNull( field, "Field '{0}' not found", fieldName );
@@ -49,12 +52,18 @@ namespace NUnit.ConsoleRunner.Tests
 			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize /" + option );
 		}
 
-		private void TestStringOption( string fieldName )
-		{
-			TestStringOption( fieldName, fieldName );
-		}
-
-		private void TestStringOption( string fieldName, string option )
+		[TestCase( "fixture", "fixture" )]
+		[TestCase( "config", "config")]
+        [TestCase( "result", "result")]
+		[TestCase( "result", "xml" )]
+		[TestCase( "output", "output" )]
+		[TestCase( "output", "out" )]
+		[TestCase( "err", "err" )]
+        [TestCase( "include", "include" )]
+		[TestCase( "exclude", "exclude" )]
+        [TestCase("run", "run")]
+        [TestCase("runlist", "runlist")]
+		public void StringOptionsAreRecognized( string fieldName, string option )
 		{
 			FieldInfo field = typeof(ConsoleOptions).GetField( fieldName );
 			Assert.IsNotNull( field, "Field {0} not found", fieldName );
@@ -70,7 +79,9 @@ namespace NUnit.ConsoleRunner.Tests
 			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize /" + option );
 		}
 
-		private void TestEnumOption( string fieldName )
+        [TestCase("domain")]
+        [TestCase("trace")]
+		public void EnumOptionsAreRecognized( string fieldName )
 		{
 			FieldInfo field = typeof(ConsoleOptions).GetField( fieldName );
 			Assert.IsNotNull( field, "Field {0} not found", fieldName );
@@ -78,29 +89,6 @@ namespace NUnit.ConsoleRunner.Tests
 		}
 
 		[Test]
-		public void OptionsAreRecognized()
-		{
-			TestBooleanOption( "nologo" );
-			TestBooleanOption( "help" );
-			TestBooleanOption( "help", "?" );
-			TestBooleanOption( "wait" );
-			TestBooleanOption( "xmlConsole" );
-			TestBooleanOption( "labels" );
-			TestBooleanOption( "noshadow" );
-			TestBooleanOption( "nothread" );
-			TestStringOption( "fixture" );
-			TestStringOption( "config" );
-			TestStringOption( "xml" );
-			TestStringOption( "output" );
-			TestStringOption( "output", "out" );
-			TestStringOption( "err" );
-            TestStringOption("include");
-			TestStringOption( "exclude" );
-			TestEnumOption( "domain" );
-            TestEnumOption("trace");
-        }
-
-		[Test]
 		public void AssemblyName()
 		{
 			ConsoleOptions options = new ConsoleOptions( "nunit.tests.dll" );
@@ -151,7 +139,7 @@ namespace NUnit.ConsoleRunner.Tests
 			ConsoleOptions options = new ConsoleOptions( "tests.dll", "-xml:results.xml" );
 			Assert.IsTrue(options.ParameterCount == 1, "assembly should be set");
 			Assert.AreEqual("tests.dll", options.Parameters[0]);
-			Assert.AreEqual("results.xml", options.xml);
+			Assert.AreEqual("results.xml", options.result);
 		}
 
 		[Test]
@@ -160,7 +148,7 @@ namespace NUnit.ConsoleRunner.Tests
 			ConsoleOptions options = new ConsoleOptions( "tests.dll", "-xml:C:/nunit/tests/bin/Debug/console-test.xml" );
 			Assert.IsTrue(options.ParameterCount == 1, "assembly should be set");
 			Assert.AreEqual("tests.dll", options.Parameters[0]);
-			Assert.AreEqual("C:/nunit/tests/bin/Debug/console-test.xml", options.xml);
+			Assert.AreEqual("C:/nunit/tests/bin/Debug/console-test.xml", options.result);
 		}
 
 		[Test]
@@ -169,7 +157,7 @@ namespace NUnit.ConsoleRunner.Tests
 			ConsoleOptions options = new ConsoleOptions( "tests.dll", "-xml=C:/nunit/tests/bin/Debug/console-test.xml" );
 			Assert.IsTrue(options.ParameterCount == 1, "assembly should be set");
 			Assert.AreEqual("tests.dll", options.Parameters[0]);
-			Assert.AreEqual("C:/nunit/tests/bin/Debug/console-test.xml", options.xml);
+			Assert.AreEqual("C:/nunit/tests/bin/Debug/console-test.xml", options.result);
 		}
 
 		[Test]
diff --git a/src/ConsoleRunner/tests/ConsoleRunnerTest.cs b/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
index 18c8f90..2dd828b 100644
--- a/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
+++ b/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
@@ -23,7 +23,7 @@ namespace NUnit.ConsoleRunner.Tests
             string.Format( "Errors: {0}, Failures: {1}", 
                 MockAssembly.Errors, MockAssembly.Failures );
 
-		private static readonly string xmlFile = "console-test.xml";
+		private static readonly string xmlFile = Path.Combine(Path.GetTempPath(), "console-test.xml");
 		private StringBuilder output;
 		TextWriter saveOut;
 
@@ -52,22 +52,21 @@ namespace NUnit.ConsoleRunner.Tests
 		[Test]
 		public void FailureFixture() 
 		{
-			int resultCode = runFixture( typeof ( FailureTest ) ); 
+            int resultCode = runFixture(typeof(FailureTest), "-noxml"); 
 			Assert.AreEqual(1, resultCode);
 		}
 
 		[Test]
 		public void MultiFailureFixture() 
 		{
-			int resultCode = runFixture( typeof ( MultiFailureTest ) ); 
+            int resultCode = runFixture(typeof(MultiFailureTest), "-noxml"); 
 			Assert.AreEqual(3, resultCode);
 		}
 
 		[Test]
 		public void SuccessFixture()
 		{
-			int resultCode = runFixture( 
-				typeof(SuccessTest) );
+            int resultCode = runFixture(typeof(SuccessTest), "-noxml");
 			Assert.AreEqual(0, resultCode);
 		}
 
@@ -77,9 +76,7 @@ namespace NUnit.ConsoleRunner.Tests
 			FileInfo info = new FileInfo(xmlFile);
 			info.Delete();
 
-			int resultCode = runFixture( 
-				typeof(SuccessTest),
-				"-xml:" + info.FullName );
+			int resultCode = runFixture(typeof(SuccessTest), "-xml:" + xmlFile);
 
 			Assert.AreEqual(0, resultCode);
 			Assert.AreEqual(true, info.Exists);
@@ -88,21 +85,21 @@ namespace NUnit.ConsoleRunner.Tests
 		[Test]
 		public void InvalidFixture()
 		{
-			int resultCode = executeConsole( new string[] { MockAssembly.AssemblyPath, "-fixture:NUnit.Tests.BogusTest", "-trace:Off" });
+			int resultCode = executeConsole( new string[] { MockAssembly.AssemblyPath, "-fixture:NUnit.Tests.BogusTest", "-noxml" });
 			Assert.AreEqual(ConsoleUi.FIXTURE_NOT_FOUND, resultCode);
 		}
 
 		[Test]
 		public void AssemblyNotFound()
 		{
-            int resultCode = executeConsole(new string[] { "badassembly.dll", "-trace:Off" });
+            int resultCode = executeConsole(new string[] { "badassembly.dll", "-noxml" });
             Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
         }
 
         [Test]
         public void OneOfTwoAssembliesNotFound()
         {
-            int resultCode = executeConsole(new string[] { GetType().Module.Name, "badassembly.dll", "-trace:Off" });
+            int resultCode = executeConsole(new string[] { GetType().Module.Name, "badassembly.dll", "-noxml" });
             Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
         }
 
@@ -122,80 +119,90 @@ namespace NUnit.ConsoleRunner.Tests
 		[Test]
 		public void Bug1073539Test()
 		{
-			int resultCode = runFixture( typeof( Bug1073539Fixture ) );
+			int resultCode = runFixture( typeof( Bug1073539Fixture ), "-noxml" );
 			Assert.AreEqual( 1, resultCode );
 		}
 
 		[Test]
 		public void Bug1311644Test()
 		{
-			int resultCode = runFixture( typeof( Bug1311644Fixture ) );
+			int resultCode = runFixture( typeof( Bug1311644Fixture ), "-noxml" );
 			Assert.AreEqual( 1, resultCode );
 		}
 
 		[Test]
 		public void CanRunWithoutTestDomain()
 		{
-            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-process:single", "-trace:Off"));
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-noxml"));
 			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithSingleTestDomain()
 		{
-            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-process:single", "-trace:Off"));
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-noxml"));
 			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithMultipleTestDomains()
 		{
-            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-process:single", "-trace:Off"));
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-noxml"));
 			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithoutTestDomain_NoThread()
 		{
-            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-nothread", "-process:single", "-trace:Off"));
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-nothread", "-noxml"));
 			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithSingleTestDomain_NoThread()
 		{
-            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-nothread", "-process:single", "-trace:Off"));
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-nothread", "-noxml"));
 			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		[Test]
 		public void CanRunWithMultipleTestDomains_NoThread()
 		{
-            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-nothread", "-process:single", "-trace:Off"));
+            Assert.AreEqual(MockAssembly.ErrorsAndFailures, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-nothread", "-noxml"));
 			StringAssert.Contains( failureMsg, output.ToString() );
 		}
 
 		private int runFixture( Type type )
 		{
-			return executeConsole( new string[] { AssemblyHelper.GetAssemblyPath(type), "-trace:Off", "-process:single", "-fixture:" + type.FullName });
+            return executeConsole(new string[] { AssemblyHelper.GetAssemblyPath(type), "-fixture:" + type.FullName, "-noxml" });
 		}
 
 		private int runFixture( Type type, params string[] arguments )
 		{
-			string[] args = new string[arguments.Length+4];
+			string[] args = new string[arguments.Length+2];
 			int n = 0;
 			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;
 			return executeConsole( args ); 
 		}
 
-		private int executeConsole( params string[] arguments )
+        // Run test in process using console. For test purposes,
+        // avoid use of another process and turn trace off.
+        private int executeConsole( params string[] arguments )
 		{
-			return NUnit.ConsoleRunner.Runner.Main( arguments );
+            int n = 0;
+#if CLR_2_0 || CLR_4_0
+            string[] args = new string[arguments.Length + 2];
+            args[n++] = "-process:single";
+#else
+            string[] args = new string[arguments.Length + 1];
+#endif
+            args[n++] = "-trace:Off";
+            foreach (string arg in arguments)
+                args[n++] = arg;
+			return NUnit.ConsoleRunner.Runner.Main( args );
 		}
 	}
 }
diff --git a/src/ConsoleRunner/tests/nunit-console.tests.csproj b/src/ConsoleRunner/tests/nunit-console.tests.csproj
index 14c1247..094100e 100644
--- a/src/ConsoleRunner/tests/nunit-console.tests.csproj
+++ b/src/ConsoleRunner/tests/nunit-console.tests.csproj
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -46,7 +46,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
diff --git a/src/GuiComponents/UiKit/AddConfigurationDialog.cs b/src/GuiComponents/UiKit/AddConfigurationDialog.cs
index 039d0f3..8f8bc58 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.
+// 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;
@@ -22,7 +22,7 @@ namespace NUnit.UiKit
     /// A DialogResult of DialogResult.OK indicates that the
     /// configuration was added successfully.
     /// </summary>
-	public class AddConfigurationDialog : System.Windows.Forms.Form
+    public class AddConfigurationDialog : NUnitFormBase
 	{
 		#region Instance variables
 
@@ -196,14 +196,13 @@ namespace NUnit.UiKit
 
 			if ( configurationName == string.Empty )
 			{
-				UserMessage.Display( "No configuration name provided", "Configuration Name Error" );
+                MessageDisplay.Error("No configuration name provided");
 				return;
 			}
 
 			if ( project.Configs.Contains( configurationName ) )
 			{
-				// TODO: Need general error message display
-				UserMessage.Display( "A configuration with that name already exists", "Configuration Name Error" );
+                MessageDisplay.Error("A configuration with that name already exists");
 				return;
 			}
 
diff --git a/src/GuiComponents/UiKit/AddTabPageDialog.cs b/src/GuiComponents/UiKit/AddTabPageDialog.cs
index af1c582..8f644ff 100644
--- a/src/GuiComponents/UiKit/AddTabPageDialog.cs
+++ b/src/GuiComponents/UiKit/AddTabPageDialog.cs
@@ -14,7 +14,7 @@ namespace NUnit.UiKit
 	/// <summary>
 	/// Summary description for NewTabPageDialog.
 	/// </summary>
-	public class AddTabPageDialog : System.Windows.Forms.Form
+    public class AddTabPageDialog : NUnitFormBase
 	{
 		private TextDisplayTabSettings tabSettings;
 
@@ -128,7 +128,7 @@ namespace NUnit.UiKit
 		{
 			if ( Title == string.Empty )
 			{
-				UserMessage.Display( "No title entered", "Error" );
+                MessageDisplay.Error("No title entered");
 				return;
 			}
 
diff --git a/src/GuiComponents/UiKit/ConfigurationEditor.cs b/src/GuiComponents/UiKit/ConfigurationEditor.cs
index 29a7045..c84cc70 100644
--- a/src/GuiComponents/UiKit/ConfigurationEditor.cs
+++ b/src/GuiComponents/UiKit/ConfigurationEditor.cs
@@ -18,7 +18,7 @@ namespace NUnit.UiKit
 	/// ConfigurationEditor form is designed for adding, deleting
 	/// and renaming configurations from a project.
 	/// </summary>
-	public class ConfigurationEditor : System.Windows.Forms.Form
+    public class ConfigurationEditor : NUnitFormBase
 	{
 		#region Instance Variables
 
@@ -191,8 +191,8 @@ namespace NUnit.UiKit
 			if ( project.Configs.Count == 1 )
 			{
 				string msg = "Removing the last configuration will make the project unloadable until you add another configuration.\r\rAre you sure you want to remove the configuration?";
-				
-				if( UserMessage.Ask( msg, "Remove Configuration" ) == DialogResult.No )
+
+                if (MessageDisplay.Ask(msg) == DialogResult.No)
 					return;
 			}
 
diff --git a/src/GuiComponents/UiKit/EditTabPagesDialog.cs b/src/GuiComponents/UiKit/EditTabPagesDialog.cs
index b4c8d0f..3800445 100644
--- a/src/GuiComponents/UiKit/EditTabPagesDialog.cs
+++ b/src/GuiComponents/UiKit/EditTabPagesDialog.cs
@@ -14,7 +14,7 @@ namespace NUnit.UiKit
 	/// <summary>
 	/// Summary description for EditTabPagesDialog.
 	/// </summary>
-	public class EditTabPagesDialog : System.Windows.Forms.Form
+	public class EditTabPagesDialog : NUnitFormBase
 	{
 		private TextDisplayTabSettings tabSettings;
 		private int selectedIndex = -1;
diff --git a/src/GuiComponents/UiKit/ErrorDisplay.cs b/src/GuiComponents/UiKit/ErrorDisplay.cs
index 22cb1eb..d00779d 100644
--- a/src/GuiComponents/UiKit/ErrorDisplay.cs
+++ b/src/GuiComponents/UiKit/ErrorDisplay.cs
@@ -6,6 +6,7 @@
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.ComponentModel;
 using System.Drawing;
 using System.Data;
diff --git a/src/GuiComponents/UiKit/IMessageDisplay.cs b/src/GuiComponents/UiKit/IMessageDisplay.cs
new file mode 100644
index 0000000..7e6fc24
--- /dev/null
+++ b/src/GuiComponents/UiKit/IMessageDisplay.cs
@@ -0,0 +1,30 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+    public interface IMessageDisplay
+    {
+        DialogResult Display(string message);
+        DialogResult Display(string message, MessageBoxButtons buttons);
+
+        DialogResult Error(string message);
+        DialogResult Error(string message, MessageBoxButtons buttons);
+        DialogResult Error(string message, Exception exception);
+        DialogResult Error(string message, Exception exception, MessageBoxButtons buttons);
+
+        DialogResult FatalError(string message, Exception exception);
+
+        DialogResult Info(string message);
+        DialogResult Info(string message, MessageBoxButtons buttons);
+
+        DialogResult Ask(string message);
+        DialogResult Ask(string message, MessageBoxButtons buttons);
+    }
+}
diff --git a/src/GuiComponents/UiKit/Ignored.png b/src/GuiComponents/UiKit/Ignored.png
deleted file mode 100644
index 478efbf..0000000
Binary files a/src/GuiComponents/UiKit/Ignored.png and /dev/null differ
diff --git a/src/GuiComponents/UiKit/Ellipsis.gif b/src/GuiComponents/UiKit/Images/Ellipsis.gif
similarity index 100%
rename from src/GuiComponents/UiKit/Ellipsis.gif
rename to src/GuiComponents/UiKit/Images/Ellipsis.gif
diff --git a/src/GuiComponents/UiKit/Images/Tree/Circles/Failure.jpg b/src/GuiComponents/UiKit/Images/Tree/Circles/Failure.jpg
new file mode 100644
index 0000000..c245548
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Circles/Failure.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Circles/Ignored.jpg b/src/GuiComponents/UiKit/Images/Tree/Circles/Ignored.jpg
new file mode 100644
index 0000000..0549b70
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Circles/Ignored.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Circles/Inconclusive.jpg b/src/GuiComponents/UiKit/Images/Tree/Circles/Inconclusive.jpg
new file mode 100644
index 0000000..8d36153
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Circles/Inconclusive.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Circles/Skipped.jpg b/src/GuiComponents/UiKit/Images/Tree/Circles/Skipped.jpg
new file mode 100644
index 0000000..3d84255
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Circles/Skipped.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Circles/Success.jpg b/src/GuiComponents/UiKit/Images/Tree/Circles/Success.jpg
new file mode 100644
index 0000000..15ec1b7
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Circles/Success.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Classic/Failure.jpg b/src/GuiComponents/UiKit/Images/Tree/Classic/Failure.jpg
new file mode 100644
index 0000000..658905f
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Classic/Failure.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Classic/Ignored.jpg b/src/GuiComponents/UiKit/Images/Tree/Classic/Ignored.jpg
new file mode 100644
index 0000000..95b7fdb
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Classic/Ignored.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Classic/Inconclusive.jpg b/src/GuiComponents/UiKit/Images/Tree/Classic/Inconclusive.jpg
new file mode 100644
index 0000000..32a0ff7
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Classic/Inconclusive.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Classic/Skipped.jpg b/src/GuiComponents/UiKit/Images/Tree/Classic/Skipped.jpg
new file mode 100644
index 0000000..3d84255
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Classic/Skipped.jpg differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Classic/Success.jpg b/src/GuiComponents/UiKit/Images/Tree/Classic/Success.jpg
new file mode 100644
index 0000000..3d8e760
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Classic/Success.jpg differ
diff --git a/src/GuiComponents/UiKit/Failure.png b/src/GuiComponents/UiKit/Images/Tree/Default/Failure.png
similarity index 100%
rename from src/GuiComponents/UiKit/Failure.png
rename to src/GuiComponents/UiKit/Images/Tree/Default/Failure.png
diff --git a/src/GuiComponents/UiKit/Images/Tree/Default/Ignored.png b/src/GuiComponents/UiKit/Images/Tree/Default/Ignored.png
new file mode 100644
index 0000000..05715cb
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Default/Ignored.png differ
diff --git a/src/GuiComponents/UiKit/Inconclusive.png b/src/GuiComponents/UiKit/Images/Tree/Default/Inconclusive.png
similarity index 100%
rename from src/GuiComponents/UiKit/Inconclusive.png
rename to src/GuiComponents/UiKit/Images/Tree/Default/Inconclusive.png
diff --git a/src/GuiComponents/UiKit/Skipped.png b/src/GuiComponents/UiKit/Images/Tree/Default/Skipped.png
similarity index 100%
copy from src/GuiComponents/UiKit/Skipped.png
copy to src/GuiComponents/UiKit/Images/Tree/Default/Skipped.png
diff --git a/src/GuiComponents/UiKit/Success.png b/src/GuiComponents/UiKit/Images/Tree/Default/Success.png
similarity index 100%
rename from src/GuiComponents/UiKit/Success.png
rename to src/GuiComponents/UiKit/Images/Tree/Default/Success.png
diff --git a/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Failure.png b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Failure.png
new file mode 100644
index 0000000..ba03e84
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Failure.png differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Ignored.png b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Ignored.png
new file mode 100644
index 0000000..9271d6e
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Ignored.png differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Inconclusive.png b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Inconclusive.png
new file mode 100644
index 0000000..76219b5
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Inconclusive.png differ
diff --git a/src/GuiComponents/UiKit/Images/Tree/Visual Studio/SeriousWarning.png b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/SeriousWarning.png
new file mode 100644
index 0000000..6a578cc
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/SeriousWarning.png differ
diff --git a/src/GuiComponents/UiKit/Skipped.png b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Skipped.png
similarity index 100%
rename from src/GuiComponents/UiKit/Skipped.png
rename to src/GuiComponents/UiKit/Images/Tree/Visual Studio/Skipped.png
diff --git a/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Success.png b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Success.png
new file mode 100644
index 0000000..346fe8f
Binary files /dev/null and b/src/GuiComponents/UiKit/Images/Tree/Visual Studio/Success.png differ
diff --git a/src/GuiComponents/UiKit/pinned.gif b/src/GuiComponents/UiKit/Images/pinned.gif
similarity index 100%
rename from src/GuiComponents/UiKit/pinned.gif
rename to src/GuiComponents/UiKit/Images/pinned.gif
diff --git a/src/GuiComponents/UiKit/unpinned.gif b/src/GuiComponents/UiKit/Images/unpinned.gif
similarity index 100%
rename from src/GuiComponents/UiKit/unpinned.gif
rename to src/GuiComponents/UiKit/Images/unpinned.gif
diff --git a/src/GuiComponents/UiKit/MessageDisplay.cs b/src/GuiComponents/UiKit/MessageDisplay.cs
new file mode 100644
index 0000000..de664b3
--- /dev/null
+++ b/src/GuiComponents/UiKit/MessageDisplay.cs
@@ -0,0 +1,133 @@
+// ****************************************************************
+// 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.Text;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for MessageDisplay.
+	/// </summary>
+	public class MessageDisplay : IMessageDisplay
+	{
+		private static readonly string DEFAULT_CAPTION = "NUnit";
+
+        private readonly string caption;
+
+        public MessageDisplay() : this(DEFAULT_CAPTION) { }
+
+        public MessageDisplay(string caption)
+        {
+            this.caption = caption;
+        }
+
+        #region Public Methods
+
+        #region Display
+
+        public DialogResult Display(string message)
+        {
+            return Display(message, MessageBoxButtons.OK);
+        }
+
+        public DialogResult Display(string message, MessageBoxButtons buttons)
+        {
+            return MessageBox.Show(message, caption, buttons, MessageBoxIcon.None);
+        }
+
+        #endregion
+
+        #region Error
+
+        public DialogResult Error( string message )
+		{
+            return Error(message, MessageBoxButtons.OK);
+		}
+
+        public DialogResult Error(string message, MessageBoxButtons buttons)
+        {
+            return MessageBox.Show(message, caption, buttons, MessageBoxIcon.Stop);
+        }
+
+        public DialogResult Error(string message, Exception exception)
+        {
+            return Error(message, exception, MessageBoxButtons.OK);
+        }
+
+        public DialogResult Error(string message, Exception exception, MessageBoxButtons buttons)
+        {
+            return Error( BuildMessage(message, exception, false), buttons);
+        }
+
+        public DialogResult FatalError(string message, Exception exception)
+        {
+            return Error( BuildMessage(message, exception, true), MessageBoxButtons.OK);
+        }
+
+        #endregion
+
+        #region Info
+
+        public DialogResult Info(string message)
+        {
+            return Info(message, MessageBoxButtons.OK);
+        }
+
+        public DialogResult Info(string message, MessageBoxButtons buttons)
+        {
+            return MessageBox.Show(message, caption, buttons, MessageBoxIcon.Information);
+        }
+
+        #endregion
+
+        #region Ask
+
+        public DialogResult Ask(string message)
+        {
+            return Ask(message, MessageBoxButtons.YesNo);
+        }
+
+        public DialogResult Ask(string message, MessageBoxButtons buttons)
+		{
+            return MessageBox.Show(message, caption, buttons, MessageBoxIcon.Question);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region Helper Methods
+
+        private static string BuildMessage(Exception exception)
+        {
+            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);
+            }
+
+            return sb.ToString();
+        }
+
+        private static string BuildMessage(string message, Exception exception, bool isFatal)
+        {
+            string msg = message + Environment.NewLine + Environment.NewLine + BuildMessage(exception);
+
+            return isFatal
+                ? msg
+                : msg + Environment.NewLine + Environment.NewLine + "For further information, use the Exception Details menu item.";
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiComponents/UiKit/NUnitFormBase.cs b/src/GuiComponents/UiKit/NUnitFormBase.cs
new file mode 100644
index 0000000..7530d46
--- /dev/null
+++ b/src/GuiComponents/UiKit/NUnitFormBase.cs
@@ -0,0 +1,35 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+    public class NUnitFormBase : Form
+    {
+        private IMessageDisplay messageDisplay;
+        private string caption;
+
+        public NUnitFormBase() { }
+
+        public NUnitFormBase(string caption)
+        {
+            this.caption = caption;
+        }
+
+        public IMessageDisplay MessageDisplay
+        {
+            get
+            {
+                if (messageDisplay == null)
+                    messageDisplay = new MessageDisplay(caption == null ? Text : caption);
+
+                return messageDisplay;
+            }
+        }
+    }
+}
diff --git a/src/GuiComponents/UiKit/RecentFileMenuHandler.cs b/src/GuiComponents/UiKit/RecentFileMenuHandler.cs
deleted file mode 100644
index 02228af..0000000
--- a/src/GuiComponents/UiKit/RecentFileMenuHandler.cs
+++ /dev/null
@@ -1,89 +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.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	public class RecentFileMenuHandler
-	{
-		private MenuItem menu;
-		private RecentFiles recentFiles;
-        private bool checkFilesExist = true;
-		private bool showNonRunnableFiles = false;
-
-		public RecentFileMenuHandler( MenuItem menu, RecentFiles recentFiles )
-		{
-			this.menu = menu;
-			this.recentFiles = recentFiles;
-		}
-
-		public bool CheckFilesExist
-		{
-			get { return checkFilesExist; }
-			set { checkFilesExist = value; }
-		}
-
-		public bool ShowNonRunnableFiles
-		{
-			get { return showNonRunnableFiles; }
-			set { showNonRunnableFiles = value; }
-		}
-
-		public MenuItem Menu
-		{
-			get { return menu; }
-		}
-
-		public string this[int index]
-		{
-			get { return menu.MenuItems[index].Text.Substring( 2 ); }
-		}
-
-		public void Load()
-		{
-			if ( recentFiles.Count == 0 )
-				Menu.Enabled = false;
-			else 
-			{
-				Menu.Enabled = true;
-				Menu.MenuItems.Clear();
-				int index = 1;
-				foreach ( RecentFileEntry entry in recentFiles.Entries ) 
-				{
-                    // Rather than show files that don't exist, we skip them. As
-                    // 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 ( !checkFilesExist || entry.Exists )
-                    {
-						// NOTE: In the current version, all the files listed should
-						// have a compatible version, since we are using separate
-						// settings for V1 and V2. This code will be changed in
-						// a future release to allow running under other runtimes.
-						if ( showNonRunnableFiles || entry.IsCompatibleCLRVersion )
-						{
-							MenuItem item = new MenuItem(String.Format("{0} {1}", index++, entry.Path));
-							item.Click += new System.EventHandler(OnRecentFileClick);
-							Menu.MenuItems.Add(item);
-						}
-                    }
-				}		
-			}
-		}
-
-		private void OnRecentFileClick( object sender, EventArgs e )
-		{
-			MenuItem item = (MenuItem) sender;
-			string testFileName = item.Text.Substring( 2 );
-
-			TestLoaderUI.OpenProject( item.GetMainMenu().GetForm(), testFileName ); 
-		}
-	}
-}
diff --git a/src/GuiComponents/UiKit/RenameConfigurationDialog.cs b/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
index 8018c5e..c1497ca 100644
--- a/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
+++ b/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
@@ -19,7 +19,7 @@ namespace NUnit.UiKit
     /// validates the name. The caller is responsible for
     /// actually renaming the cofiguration.
     /// </summary>
-	public class RenameConfigurationDialog : System.Windows.Forms.Form
+    public class RenameConfigurationDialog : NUnitFormBase
 	{
 		#region Instance Variables
 
@@ -141,7 +141,7 @@ namespace NUnit.UiKit
 			get{ return configurationName; }
 			set{ configurationName = value; }
 		}
-		
+
 		private void ConfigurationNameDialog_Load(object sender, System.EventArgs e)
 		{
 			if ( configurationName != null )
@@ -156,7 +156,7 @@ namespace NUnit.UiKit
 			configurationName = configurationNameTextBox.Text;		
 			if ( project.Configs.Contains( configurationName ) )
 				// TODO: Need general error message display
-				UserMessage.DisplayFailure( "A configuration with that name already exists", "Configuration Name Error" );
+                MessageDisplay.Error("A configuration with that name already exists");
 			else
 			{
 				DialogResult = DialogResult.OK;
diff --git a/src/GuiComponents/UiKit/ResultTabs.cs b/src/GuiComponents/UiKit/ResultTabs.cs
index c61c8dd..f954de7 100644
--- a/src/GuiComponents/UiKit/ResultTabs.cs
+++ b/src/GuiComponents/UiKit/ResultTabs.cs
@@ -5,7 +5,7 @@
 // ****************************************************************
 
 using System;
-using System.Collections;
+using System.Collections.Generic;
 using System.ComponentModel;
 using System.Drawing;
 using System.Data;
@@ -191,6 +191,16 @@ namespace NUnit.UiKit
 
 		}
 		#endregion
+
+        public bool IsTracingEnabled
+        {
+            get { return displayController.IsTracingEnabled; }
+        }
+
+        public LoggingThreshold MaximumLogLevel
+        {
+            get { return displayController.MaximumLogLevel; }
+        }
 	
 		public void Clear()
 		{
@@ -343,7 +353,7 @@ namespace NUnit.UiKit
 		private class TextDisplayController : TestObserver
 		{
 			private TabControl tabControl;
-			ArrayList tabPages = new ArrayList();
+			List<TextDisplayTabPage> tabPages = new List<TextDisplayTabPage>();
 
 			public TextDisplayController(TabControl tabControl)
 			{			
@@ -351,7 +361,36 @@ namespace NUnit.UiKit
 				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
 			}
 
-			public void Clear()
+            public bool IsTracingEnabled
+            {
+                get
+                {
+                    foreach (TextDisplayTabPage page in tabPages)
+                        if (page.Display.Content.Trace)
+                            return true;
+
+                    return false;
+                }
+            }
+
+            public LoggingThreshold MaximumLogLevel
+            {
+                get
+                {
+                    LoggingThreshold logLevel = LoggingThreshold.Off;
+
+                    foreach (TextDisplayTabPage page in tabPages)
+                    {
+                        LoggingThreshold level = page.Display.Content.LogLevel;
+                        if (level > logLevel)
+                            logLevel = level;
+                    }
+
+                    return logLevel;
+                }
+            }
+
+            public void Clear()
 			{
 				foreach( TextDisplayTabPage page in tabPages )
 					page.Display.Clear();
@@ -361,8 +400,8 @@ namespace NUnit.UiKit
 			{
 				TextDisplayTabSettings tabSettings = new TextDisplayTabSettings();
 				tabSettings.LoadSettings();
-				ArrayList oldPages = tabPages;
-				tabPages = new ArrayList();
+                List <TextDisplayTabPage> oldPages = tabPages;
+				tabPages = new List<TextDisplayTabPage>();
 				Font displayFont = GetFixedFont();
 
 				foreach( TextDisplayTabSettings.TabInfo tabInfo in tabSettings.Tabs )
@@ -416,11 +455,10 @@ namespace NUnit.UiKit
 									case "Title":
 										page.Text = (string)Services.UserSettings.GetSetting( settingName );
 										break;
-									case "Content":
-										page.Display.Content = 
-											(TextDisplayContent)Services.UserSettings.GetSetting( settingName );
-										break;
-								}
+                                    case "Content":
+                                        page.Display.Content.LoadSettings(tabName);
+                                        break;
+                                }
 							}
 					}
 				}
diff --git a/src/GuiComponents/UiKit/SettingsDialogBase.cs b/src/GuiComponents/UiKit/SettingsDialogBase.cs
index 4a3f661..b80da3b 100644
--- a/src/GuiComponents/UiKit/SettingsDialogBase.cs
+++ b/src/GuiComponents/UiKit/SettingsDialogBase.cs
@@ -15,7 +15,7 @@ namespace NUnit.UiKit
 	/// <summary>
 	/// Summary description for OptionsDialogBase.
 	/// </summary>
-	public class SettingsDialogBase : System.Windows.Forms.Form
+    public class SettingsDialogBase : NUnitFormBase
 	{
 		#region Instance Fields
 		protected System.Windows.Forms.Button cancelButton;
@@ -113,10 +113,12 @@ namespace NUnit.UiKit
 		#endregion
 
 		#region Properties
+
 		public SettingsPageCollection SettingsPages
 		{
 			get { return pageList; }
 		}
+
 		#endregion
 
 		#region Public Methods
@@ -139,10 +141,8 @@ namespace NUnit.UiKit
 		{
 			if ( Services.TestLoader.IsTestLoaded && this.HasChangesRequiringReload )
 			{
-				DialogResult answer = UserMessage.Ask( 
-					"Some changes will only take effect when you reload the test project. Do you want to reload now?",
-					"NUnit Options",
-					MessageBoxButtons.YesNo );
+                DialogResult answer = MessageDisplay.Ask( 
+					"Some changes will only take effect when you reload the test project. Do you want to reload now?");
 				
 				if ( answer == DialogResult.Yes )
 					this.reloadProjectOnClose = true;
diff --git a/src/GuiComponents/UiKit/SettingsPage.cs b/src/GuiComponents/UiKit/SettingsPage.cs
index efaf489..313759f 100644
--- a/src/GuiComponents/UiKit/SettingsPage.cs
+++ b/src/GuiComponents/UiKit/SettingsPage.cs
@@ -32,6 +32,8 @@ namespace NUnit.UiKit
 		private string key;
 		private string title;
 
+        private MessageDisplay messageDisplay;
+
 		// Constructor used by the Windows.Forms Designer
 		public SettingsPage()
 		{
@@ -49,6 +51,7 @@ namespace NUnit.UiKit
 			this.title = key;
 			int dot = key.LastIndexOf( '.' );
 			if ( dot >= 0 ) title = key.Substring(dot+1);
+            this.messageDisplay = new MessageDisplay("NUnit Settings");
 		}
 
 		/// <summary> 
@@ -67,6 +70,7 @@ namespace NUnit.UiKit
 		}
 
 		#region Properties
+
 		public string Key
 		{
 			get { return key; }
@@ -86,6 +90,12 @@ namespace NUnit.UiKit
 		{
 			get { return false; }
 		}
+
+        public IMessageDisplay MessageDisplay
+        {
+            get { return messageDisplay; }
+        }
+
 		#endregion
 
 		#region Public Methods
diff --git a/src/GuiComponents/UiKit/TestLoaderUI.cs b/src/GuiComponents/UiKit/TestLoaderUI.cs
deleted file mode 100644
index 31fcc29..0000000
--- a/src/GuiComponents/UiKit/TestLoaderUI.cs
+++ /dev/null
@@ -1,362 +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.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// FileHandler does all file opening and closing that
-	/// involves interacting with the user.
-	/// </summary>
-	public class TestLoaderUI
-	{
-		private static bool VisualStudioSupport
-		{
-			get 
-			{ 
-				return Services.UserSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false ); 
-			}
-		}
-
-		public static void OpenProject( Form owner )
-		{
-			OpenFileDialog dlg = new OpenFileDialog();
-			System.ComponentModel.ISite site = owner == null ? null : owner.Site;
-			if ( site != null ) dlg.Site = site;
-			dlg.Title = "Open Project";
-			
-			if ( VisualStudioSupport )
-			{
-                dlg.Filter =
-					"Projects & Assemblies(*.nunit,*.csproj,*.vbproj,*.vjsproj, *.vcproj,*.sln,*.dll,*.exe )|*.nunit;*.csproj;*.vjsproj;*.vbproj;*.vcproj;*.sln;*.dll;*.exe|" +
-					"All Project Types (*.nunit,*.csproj,*.vbproj,*.vjsproj,*.vcproj,*.sln)|*.nunit;*.csproj;*.vjsproj;*.vbproj;*.vcproj;*.sln|" +
-                    "Test Projects (*.nunit)|*.nunit|" +
-                    "Solutions (*.sln)|*.sln|" +
-                    "C# Projects (*.csproj)|*.csproj|" +
-                    "J# Projects (*.vjsproj)|*.vjsproj|" +
-                    "VB Projects (*.vbproj)|*.vbproj|" +
-                    "C++ Projects (*.vcproj)|*.vcproj|" +
-                    "Assemblies (*.dll,*.exe)|*.dll;*.exe";
-			}
-			else
-			{
-                dlg.Filter =
-                    "Projects & Assemblies(*.nunit,*.dll,*.exe)|*.nunit;*.dll;*.exe|" +
-                    "Test Projects (*.nunit)|*.nunit|" +
-                    "Assemblies (*.dll,*.exe)|*.dll;*.exe";
-			}
-
-			dlg.FilterIndex = 1;
-			dlg.FileName = "";
-
-			if ( dlg.ShowDialog( owner ) == DialogResult.OK ) 
-				OpenProject( owner, dlg.FileName );
-		}
-
-		public static void OpenProject( Form owner, string testFileName, string configName, string testName )
-		{
-			TestLoader loader = Services.TestLoader;
-
-			if ( loader.IsProjectLoaded && SaveProjectIfDirty( owner ) == DialogResult.Cancel )
-				return;
-
-			loader.LoadProject( testFileName, configName );
-			if ( loader.IsProjectLoaded )
-			{	
-				NUnitProject testProject = loader.TestProject;
-				if ( testProject.Configs.Count == 0 )
-					UserMessage.DisplayInfo( "Loaded project contains no configuration data" );
-				else if ( testProject.ActiveConfig == null )
-					UserMessage.DisplayInfo( "Loaded project has no active configuration" );
-				else if ( testProject.ActiveConfig.Assemblies.Count == 0 )
-					UserMessage.DisplayInfo( "Active configuration contains no assemblies" );
-				else
-					loader.LoadTest( testName );
-			}
-		}
-
-		public static void OpenProject( Form owner, string testFileName )
-		{
-			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 );
-		}
-
-		public static void AddToProject( Form owner, string configName )
-		{
-			TestLoader loader = Services.TestLoader;
-			ProjectConfig config = configName == null
-				? loader.TestProject.ActiveConfig
-				: loader.TestProject.Configs[configName];
-
-			OpenFileDialog dlg = new OpenFileDialog();
-			dlg.Title = "Add Assemblies To Project";
-			dlg.InitialDirectory = config.BasePath;
-
-			if ( VisualStudioSupport )
-				dlg.Filter =
-					"Projects & Assemblies(*.csproj,*.vbproj,*.vjsproj, *.vcproj,*.dll,*.exe )|*.csproj;*.vjsproj;*.vbproj;*.vcproj;*.dll;*.exe|" +
-					"Visual Studio Projects (*.csproj,*.vjsproj,*.vbproj,*.vcproj)|*.csproj;*.vjsproj;*.vbproj;*.vcproj|" +
-					"C# Projects (*.csproj)|*.csproj|" +
-					"J# Projects (*.vjsproj)|*.vjsproj|" +
-					"VB Projects (*.vbproj)|*.vbproj|" +
-					"C++ Projects (*.vcproj)|*.vcproj|" +
-					"Assemblies (*.dll,*.exe)|*.dll;*.exe";
-			else
-				dlg.Filter = "Assemblies (*.dll,*.exe)|*.dll;*.exe";
-
-			dlg.FilterIndex = 1;
-			dlg.FileName = "";
-
-			if ( dlg.ShowDialog( owner ) != DialogResult.OK )
-				return;
-
-            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 )
-		{
-			AddAssembly( owner, null );
-		}
-
-		public static void AddAssembly( Form owner, string configName )
-		{
-			TestLoader loader = Services.TestLoader;
-			ProjectConfig config = configName == null
-				? loader.TestProject.ActiveConfig
-				: loader.TestProject.Configs[configName];
-
-			OpenFileDialog dlg = new OpenFileDialog();
-			dlg.Title = "Add Assembly";
-			dlg.InitialDirectory = config.BasePath;
-            dlg.Filter = "Assemblies (*.dll,*.exe)|*.dll;*.exe";
-			dlg.FilterIndex = 1;
-			dlg.FileName = "";
-
-            if (dlg.ShowDialog(owner) == DialogResult.OK)
-                config.Assemblies.Add(dlg.FileName);
-		}
-
-		public static void AddVSProject( Form owner )
-		{
-			TestLoader loader = Services.TestLoader;
-			OpenFileDialog dlg = new OpenFileDialog();
-			dlg.Title = "Add Visual Studio Project";
-
-			dlg.Filter =
-				"All Project Types (*.csproj,*.vjsproj,*.vbproj,*.vcproj)|*.csproj;*.vjsproj;*.vbproj;*.vcproj|" +
-				"C# Projects (*.csproj)|*.csproj|" +
-				"J# Projects (*.vjsproj)|*.vjsproj|" +
-				"VB Projects (*.vbproj)|*.vbproj|" +
-				"C++ Projects (*.vcproj)|*.vcproj|" +
-				"All Files (*.*)|*.*";
-
-			dlg.FilterIndex = 1;
-			dlg.FileName = "";
-
-			if ( dlg.ShowDialog( owner ) == DialogResult.OK ) 
-			{
-				try
-				{
-					VSProject vsProject = new VSProject( dlg.FileName );
-					loader.TestProject.Add( vsProject );
-				}
-				catch( Exception ex )
-				{
-					UserMessage.DisplayFailure( ex.Message, "Invalid VS Project" );
-				}
-			}
-        }
-
-		private static bool CanWriteProjectFile( string path )
-		{
-			return !File.Exists( path ) || 
-				( File.GetAttributes( path ) & FileAttributes.ReadOnly ) == 0;
-		}
-
-		public static void SaveProject( Form owner )
-		{
-			TestLoader loader = Services.TestLoader;
-
-			if ( Path.IsPathRooted( loader.TestProject.ProjectPath ) &&
-				 NUnitProject.IsNUnitProjectFile( loader.TestProject.ProjectPath ) &&
-				 CanWriteProjectFile( loader.TestProject.ProjectPath ) )
-				loader.TestProject.Save();
-			else
-				SaveProjectAs( owner );
-		}
-
-		public static void SaveProjectAs( Form owner )
-		{
-			TestLoader loader = Services.TestLoader;
-
-			SaveFileDialog dlg = new SaveFileDialog();
-			dlg.Title = "Save Test Project";
-			dlg.Filter = "NUnit Test Project (*.nunit)|*.nunit|All Files (*.*)|*.*";
-			string path = NUnitProject.ProjectPathFromFile( loader.TestProject.ProjectPath );
-			if ( CanWriteProjectFile( path ) )
-				dlg.FileName = path;
-			dlg.DefaultExt = "nunit";
-			dlg.ValidateNames = true;
-			dlg.OverwritePrompt = true;
-
-			while( dlg.ShowDialog( owner ) == DialogResult.OK )
-			{
-				if ( !CanWriteProjectFile( dlg.FileName ) )
-					UserMessage.DisplayInfo( string.Format( "File {0} is write-protected. Select another file name.", dlg.FileName ) );
-				else
-				{
-					loader.TestProject.Save( dlg.FileName );
-					return;
-				}
-			}
-		}
-
-		public static void NewProject( Form owner )
-		{
-			TestLoader loader = Services.TestLoader;
-			SaveFileDialog dlg = new SaveFileDialog();
-			dlg.Title = "New Test Project";
-			dlg.Filter = "NUnit Test Project (*.nunit)|*.nunit|All Files (*.*)|*.*";
-			dlg.FileName = Services.ProjectService.GenerateProjectName();
-			dlg.DefaultExt = "nunit";
-			dlg.ValidateNames = true;
-			dlg.OverwritePrompt = true;
-
-			if ( dlg.ShowDialog( owner ) == DialogResult.OK )
-				loader.NewProject( dlg.FileName );
-		}
-
-		public static DialogResult CloseProject( Form owner )
-		{
-			DialogResult result = SaveProjectIfDirty( owner );
-
-			if( result != DialogResult.Cancel )
-				Services.TestLoader.UnloadProject();
-
-			return result;
-		}
-
-		private static DialogResult SaveProjectIfDirty( Form owner )
-		{
-			DialogResult result = DialogResult.OK;
-			NUnitProject project = Services.TestLoader.TestProject;
-
-			if( project.IsDirty )
-			{
-				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 )
-					SaveProject( owner );
-			}
-
-			return result;
-		}
-
-		public static void SaveLastResult( Form owner )
-		{
-			//TODO: Save all results
-			TestLoader loader = Services.TestLoader;
-			
-			SaveFileDialog dlg = new SaveFileDialog();
-			dlg.Title = "Save Test Results as XML";
-			dlg.Filter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*";
-			dlg.FileName = "TestResult.xml";
-			dlg.InitialDirectory = Path.GetDirectoryName( loader.TestFileName );
-			dlg.DefaultExt = "xml";
-			dlg.ValidateNames = true;
-			dlg.OverwritePrompt = true;
-
-			if ( dlg.ShowDialog( owner ) == DialogResult.OK )
-			{
-				try
-				{
-					string fileName = dlg.FileName;
-
-					loader.SaveLastResult( fileName );
-
-					string msg = String.Format( "Results saved as {0}", fileName );
-					UserMessage.DisplayInfo( msg, "Save Results as XML" );
-				}
-				catch( Exception exception )
-				{
-					UserMessage.DisplayFailure( exception, "Unable to Save Results" );
-				}
-			}
-		}
-	}
-}
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs b/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs
new file mode 100644
index 0000000..03777fe
--- /dev/null
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs
@@ -0,0 +1,379 @@
+namespace NUnit.UiKit
+{
+    partial class TestPropertiesDialog
+    {
+        /// <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.testResult = new System.Windows.Forms.Label();
+            this.pinButton = new System.Windows.Forms.CheckBox();
+            this.testName = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.hiddenProperties = new System.Windows.Forms.CheckBox();
+            this.categories = new System.Windows.Forms.Label();
+            this.properties = new System.Windows.Forms.ListBox();
+            this.propertiesLabel = new System.Windows.Forms.Label();
+            this.testCaseCount = new System.Windows.Forms.Label();
+            this.ignoreReasonLabel = new System.Windows.Forms.Label();
+            this.testCaseCountLabel = new System.Windows.Forms.Label();
+            this.shouldRun = new System.Windows.Forms.Label();
+            this.shouldRunLabel = new System.Windows.Forms.Label();
+            this.testType = new System.Windows.Forms.Label();
+            this.testTypeLabel = new System.Windows.Forms.Label();
+            this.categoriesLabel = new System.Windows.Forms.Label();
+            this.descriptionLabel = new System.Windows.Forms.Label();
+            this.fullNameLabel = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.assertCount = new System.Windows.Forms.Label();
+            this.messageLabel = new System.Windows.Forms.Label();
+            this.elapsedTime = new System.Windows.Forms.Label();
+            this.stackTraceLabel = new System.Windows.Forms.Label();
+            this.message = new CP.Windows.Forms.ExpandingLabel();
+            this.stackTrace = new CP.Windows.Forms.ExpandingLabel();
+            this.description = new CP.Windows.Forms.ExpandingLabel();
+            this.ignoreReason = new CP.Windows.Forms.ExpandingLabel();
+            this.fullName = new CP.Windows.Forms.ExpandingLabel();
+            this.groupBox1.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // testResult
+            // 
+            this.testResult.Location = new System.Drawing.Point(9, 11);
+            this.testResult.Name = "testResult";
+            this.testResult.Size = new System.Drawing.Size(120, 16);
+            this.testResult.TabIndex = 0;
+            this.testResult.Text = "Inconclusive";
+            // 
+            // 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(416, 10);
+            this.pinButton.Name = "pinButton";
+            this.pinButton.Size = new System.Drawing.Size(20, 20);
+            this.pinButton.TabIndex = 2;
+            this.pinButton.Click += new System.EventHandler(this.pinButton_Click);
+            // 
+            // testName
+            // 
+            this.testName.Location = new System.Drawing.Point(135, 12);
+            this.testName.Name = "testName";
+            this.testName.Size = new System.Drawing.Size(280, 14);
+            this.testName.TabIndex = 1;
+            // 
+            // 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.hiddenProperties);
+            this.groupBox1.Controls.Add(this.description);
+            this.groupBox1.Controls.Add(this.categories);
+            this.groupBox1.Controls.Add(this.properties);
+            this.groupBox1.Controls.Add(this.propertiesLabel);
+            this.groupBox1.Controls.Add(this.testCaseCount);
+            this.groupBox1.Controls.Add(this.ignoreReason);
+            this.groupBox1.Controls.Add(this.ignoreReasonLabel);
+            this.groupBox1.Controls.Add(this.testCaseCountLabel);
+            this.groupBox1.Controls.Add(this.shouldRun);
+            this.groupBox1.Controls.Add(this.shouldRunLabel);
+            this.groupBox1.Controls.Add(this.testType);
+            this.groupBox1.Controls.Add(this.testTypeLabel);
+            this.groupBox1.Controls.Add(this.categoriesLabel);
+            this.groupBox1.Controls.Add(this.descriptionLabel);
+            this.groupBox1.Controls.Add(this.fullName);
+            this.groupBox1.Controls.Add(this.fullNameLabel);
+            this.groupBox1.Location = new System.Drawing.Point(12, 39);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(424, 218);
+            this.groupBox1.TabIndex = 3;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Test Details";
+            // 
+            // hiddenProperties
+            // 
+            this.hiddenProperties.AutoSize = true;
+            this.hiddenProperties.Location = new System.Drawing.Point(139, 192);
+            this.hiddenProperties.Name = "hiddenProperties";
+            this.hiddenProperties.Size = new System.Drawing.Size(144, 17);
+            this.hiddenProperties.TabIndex = 16;
+            this.hiddenProperties.Text = "Display hidden properties";
+            this.hiddenProperties.UseVisualStyleBackColor = true;
+            this.hiddenProperties.CheckedChanged += new System.EventHandler(this.hiddenProperties_CheckedChanged);
+            // 
+            // categories
+            // 
+            this.categories.Location = new System.Drawing.Point(101, 86);
+            this.categories.Name = "categories";
+            this.categories.Size = new System.Drawing.Size(309, 16);
+            this.categories.TabIndex = 7;
+            // 
+            // 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.Location = new System.Drawing.Point(104, 143);
+            this.properties.Name = "properties";
+            this.properties.Size = new System.Drawing.Size(308, 43);
+            this.properties.TabIndex = 15;
+            // 
+            // propertiesLabel
+            // 
+            this.propertiesLabel.Location = new System.Drawing.Point(13, 143);
+            this.propertiesLabel.Name = "propertiesLabel";
+            this.propertiesLabel.Size = new System.Drawing.Size(80, 16);
+            this.propertiesLabel.TabIndex = 14;
+            this.propertiesLabel.Text = "Properties:";
+            // 
+            // testCaseCount
+            // 
+            this.testCaseCount.Location = new System.Drawing.Point(101, 108);
+            this.testCaseCount.Name = "testCaseCount";
+            this.testCaseCount.Size = new System.Drawing.Size(48, 15);
+            this.testCaseCount.TabIndex = 9;
+            // 
+            // ignoreReasonLabel
+            // 
+            this.ignoreReasonLabel.Location = new System.Drawing.Point(13, 125);
+            this.ignoreReasonLabel.Name = "ignoreReasonLabel";
+            this.ignoreReasonLabel.RightToLeft = System.Windows.Forms.RightToLeft.No;
+            this.ignoreReasonLabel.Size = new System.Drawing.Size(80, 16);
+            this.ignoreReasonLabel.TabIndex = 12;
+            this.ignoreReasonLabel.Text = "Reason:";
+            // 
+            // testCaseCountLabel
+            // 
+            this.testCaseCountLabel.Location = new System.Drawing.Point(13, 108);
+            this.testCaseCountLabel.Name = "testCaseCountLabel";
+            this.testCaseCountLabel.Size = new System.Drawing.Size(80, 15);
+            this.testCaseCountLabel.TabIndex = 8;
+            this.testCaseCountLabel.Text = "Test Count:";
+            // 
+            // shouldRun
+            // 
+            this.shouldRun.Location = new System.Drawing.Point(299, 108);
+            this.shouldRun.Name = "shouldRun";
+            this.shouldRun.Size = new System.Drawing.Size(88, 15);
+            this.shouldRun.TabIndex = 11;
+            this.shouldRun.Text = "Yes";
+            // 
+            // shouldRunLabel
+            // 
+            this.shouldRunLabel.Location = new System.Drawing.Point(183, 108);
+            this.shouldRunLabel.Name = "shouldRunLabel";
+            this.shouldRunLabel.Size = new System.Drawing.Size(84, 15);
+            this.shouldRunLabel.TabIndex = 10;
+            this.shouldRunLabel.Text = "Should Run?";
+            // 
+            // testType
+            // 
+            this.testType.Location = new System.Drawing.Point(101, 24);
+            this.testType.Name = "testType";
+            this.testType.Size = new System.Drawing.Size(311, 16);
+            this.testType.TabIndex = 1;
+            // 
+            // testTypeLabel
+            // 
+            this.testTypeLabel.Location = new System.Drawing.Point(13, 24);
+            this.testTypeLabel.Name = "testTypeLabel";
+            this.testTypeLabel.Size = new System.Drawing.Size(80, 16);
+            this.testTypeLabel.TabIndex = 0;
+            this.testTypeLabel.Text = "Test Type:";
+            // 
+            // categoriesLabel
+            // 
+            this.categoriesLabel.Location = new System.Drawing.Point(13, 86);
+            this.categoriesLabel.Name = "categoriesLabel";
+            this.categoriesLabel.Size = new System.Drawing.Size(80, 16);
+            this.categoriesLabel.TabIndex = 6;
+            this.categoriesLabel.Text = "Categories:";
+            // 
+            // descriptionLabel
+            // 
+            this.descriptionLabel.Location = new System.Drawing.Point(13, 64);
+            this.descriptionLabel.Name = "descriptionLabel";
+            this.descriptionLabel.Size = new System.Drawing.Size(80, 17);
+            this.descriptionLabel.TabIndex = 4;
+            this.descriptionLabel.Text = "Description:";
+            // 
+            // fullNameLabel
+            // 
+            this.fullNameLabel.Location = new System.Drawing.Point(13, 43);
+            this.fullNameLabel.Name = "fullNameLabel";
+            this.fullNameLabel.Size = new System.Drawing.Size(80, 17);
+            this.fullNameLabel.TabIndex = 2;
+            this.fullNameLabel.Text = "Full Name:";
+            // 
+            // 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.assertCount);
+            this.groupBox2.Controls.Add(this.messageLabel);
+            this.groupBox2.Controls.Add(this.elapsedTime);
+            this.groupBox2.Controls.Add(this.stackTraceLabel);
+            this.groupBox2.Controls.Add(this.message);
+            this.groupBox2.Controls.Add(this.stackTrace);
+            this.groupBox2.Location = new System.Drawing.Point(12, 263);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(424, 136);
+            this.groupBox2.TabIndex = 4;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Result";
+            // 
+            // assertCount
+            // 
+            this.assertCount.Location = new System.Drawing.Point(234, 26);
+            this.assertCount.Name = "assertCount";
+            this.assertCount.Size = new System.Drawing.Size(178, 16);
+            this.assertCount.TabIndex = 1;
+            this.assertCount.Text = "Assert Count:";
+            // 
+            // messageLabel
+            // 
+            this.messageLabel.Location = new System.Drawing.Point(18, 47);
+            this.messageLabel.Name = "messageLabel";
+            this.messageLabel.Size = new System.Drawing.Size(80, 17);
+            this.messageLabel.TabIndex = 2;
+            this.messageLabel.Text = "Message:";
+            // 
+            // elapsedTime
+            // 
+            this.elapsedTime.Location = new System.Drawing.Point(18, 26);
+            this.elapsedTime.Name = "elapsedTime";
+            this.elapsedTime.Size = new System.Drawing.Size(192, 16);
+            this.elapsedTime.TabIndex = 0;
+            this.elapsedTime.Text = "Execution Time:";
+            // 
+            // stackTraceLabel
+            // 
+            this.stackTraceLabel.Location = new System.Drawing.Point(18, 70);
+            this.stackTraceLabel.Name = "stackTraceLabel";
+            this.stackTraceLabel.Size = new System.Drawing.Size(80, 15);
+            this.stackTraceLabel.TabIndex = 4;
+            this.stackTraceLabel.Text = "Stack:";
+            // 
+            // 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(106, 47);
+            this.message.Name = "message";
+            this.message.Size = new System.Drawing.Size(306, 17);
+            this.message.TabIndex = 3;
+            // 
+            // stackTrace
+            // 
+            this.stackTrace.CopySupported = true;
+            this.stackTrace.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
+            this.stackTrace.Location = new System.Drawing.Point(106, 70);
+            this.stackTrace.Name = "stackTrace";
+            this.stackTrace.Size = new System.Drawing.Size(306, 50);
+            this.stackTrace.TabIndex = 5;
+            // 
+            // description
+            // 
+            this.description.CopySupported = true;
+            this.description.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Both;
+            this.description.Location = new System.Drawing.Point(101, 64);
+            this.description.Name = "description";
+            this.description.Size = new System.Drawing.Size(311, 17);
+            this.description.TabIndex = 5;
+            // 
+            // ignoreReason
+            // 
+            this.ignoreReason.CopySupported = true;
+            this.ignoreReason.Expansion = CP.Windows.Forms.TipWindow.ExpansionStyle.Vertical;
+            this.ignoreReason.Location = new System.Drawing.Point(101, 125);
+            this.ignoreReason.Name = "ignoreReason";
+            this.ignoreReason.RightToLeft = System.Windows.Forms.RightToLeft.No;
+            this.ignoreReason.Size = new System.Drawing.Size(311, 16);
+            this.ignoreReason.TabIndex = 13;
+            // 
+            // fullName
+            // 
+            this.fullName.CopySupported = true;
+            this.fullName.Location = new System.Drawing.Point(101, 43);
+            this.fullName.Name = "fullName";
+            this.fullName.Size = new System.Drawing.Size(309, 15);
+            this.fullName.TabIndex = 3;
+            // 
+            // TestPropertiesDialog
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(448, 410);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.testName);
+            this.Controls.Add(this.pinButton);
+            this.Controls.Add(this.testResult);
+            this.Name = "TestPropertiesDialog";
+            this.Text = "Test Properties";
+            this.Load += new System.EventHandler(this.TestPropertiesDialog_Load);
+            this.SizeChanged += new System.EventHandler(this.TestPropertiesDialog_SizeChanged);
+            this.ResizeEnd += new System.EventHandler(this.TestPropertiesDialog_ResizeEnd);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.groupBox2.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label testResult;
+        private System.Windows.Forms.CheckBox pinButton;
+        private System.Windows.Forms.Label testName;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private CP.Windows.Forms.ExpandingLabel description;
+        private System.Windows.Forms.Label categories;
+        private System.Windows.Forms.ListBox properties;
+        private System.Windows.Forms.Label propertiesLabel;
+        private System.Windows.Forms.Label testCaseCount;
+        private CP.Windows.Forms.ExpandingLabel ignoreReason;
+        private System.Windows.Forms.Label ignoreReasonLabel;
+        private System.Windows.Forms.Label testCaseCountLabel;
+        private System.Windows.Forms.Label shouldRun;
+        private System.Windows.Forms.Label shouldRunLabel;
+        private System.Windows.Forms.Label testType;
+        private System.Windows.Forms.Label testTypeLabel;
+        private System.Windows.Forms.Label categoriesLabel;
+        private System.Windows.Forms.Label descriptionLabel;
+        private CP.Windows.Forms.ExpandingLabel fullName;
+        private System.Windows.Forms.Label fullNameLabel;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.Label assertCount;
+        private System.Windows.Forms.Label messageLabel;
+        private System.Windows.Forms.Label elapsedTime;
+        private System.Windows.Forms.Label stackTraceLabel;
+        private CP.Windows.Forms.ExpandingLabel message;
+        private CP.Windows.Forms.ExpandingLabel stackTrace;
+        private System.Windows.Forms.CheckBox hiddenProperties;
+    }
+}
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.cs b/src/GuiComponents/UiKit/TestPropertiesDialog.cs
index 3261837..cff8f13 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.cs
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.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.
 // ****************************************************************
 
+using System;
 using System.Drawing;
 using System.ComponentModel;
 using System.Windows.Forms;
@@ -14,541 +15,101 @@ using NUnit.Core;
 
 namespace NUnit.UiKit
 {
-	/// <summary>
-	/// Summary description for TestPropertiesDialog.
-	/// </summary>
-	public class TestPropertiesDialog : System.Windows.Forms.Form
-	{
-		#region Instance Variables;
-
-		private TestSuiteTreeNode node;
-		private ITest test;
-		private TestResult result;
-
-		private Image pinnedImage;
-		private Image unpinnedImage;
-		private System.Windows.Forms.CheckBox pinButton;
-		private System.Windows.Forms.Label testResult;
-		private System.Windows.Forms.Label testName;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label7;
-		private CP.Windows.Forms.ExpandingLabel description;
-		private System.Windows.Forms.Label label6;
-		private System.Windows.Forms.Label testCaseCount;
-		private System.Windows.Forms.Label label4;
-		private System.Windows.Forms.Label shouldRun;
-		private System.Windows.Forms.Label label2;
-		private CP.Windows.Forms.ExpandingLabel fullName;
-		private System.Windows.Forms.Label label1;
-		private CP.Windows.Forms.ExpandingLabel ignoreReason;
-		private System.Windows.Forms.Label label5;
-		private System.Windows.Forms.Label label8;
-		private System.Windows.Forms.Label testType;
-		private System.Windows.Forms.Label label3;
-		private CP.Windows.Forms.ExpandingLabel stackTrace;
-		private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.Label label10;
-		private System.Windows.Forms.Label elapsedTime;
-		private CP.Windows.Forms.ExpandingLabel message;
-		private System.Windows.Forms.Label label12;
-		private System.Windows.Forms.Label label11;
-		private System.Windows.Forms.Label assertCount;
-		private System.Windows.Forms.ListBox properties;
-		private System.Windows.Forms.ListBox categories;
-		private System.ComponentModel.IContainer components = null;
-
-		#endregion
-
-		#region Construction and Disposal
-
-		public TestPropertiesDialog( TestSuiteTreeNode node )
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			this.node = node;
-		}
-
-		/// <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 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.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);
-
-		}
-
-		#endregion
-
-		#region Properties
-
-		[Browsable( false )]
-		public bool Pinned
-		{
-			get { return pinButton.Checked; }
-			set { pinButton.Checked = value; }
-		}
-
-		#endregion
-
-		#region Methods
-
-		private void SetTitleBarText()
-		{
-			string name = test.TestName.Name;
-			int index = name.LastIndexOfAny( new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar } );
-			if ( index >= 0 )
-				name = name.Substring( index + 1 );
-			this.Text = string.Format( "{0} Properties - {1}", node.TestType, name );
-		}
-
-		/// <summary>
-		/// Set up all dialog fields when it loads
-		/// </summary>
-		private void TestPropertiesDialog_Load(object sender, System.EventArgs e)
-		{
-			pinnedImage = new Bitmap( typeof( TestPropertiesDialog ), "pinned.gif" );
-			unpinnedImage = new Bitmap( typeof( TestPropertiesDialog ), "unpinned.gif" );
-			pinButton.Image = unpinnedImage;
-
-			DisplayProperties();
-
-			node.TreeView.AfterSelect += new TreeViewEventHandler( OnSelectedNodeChanged );	
-		}
-
-		private void OnSelectedNodeChanged( object sender, TreeViewEventArgs e )
-		{
-			if ( pinButton.Checked )
-			{
-				DisplayProperties( (TestSuiteTreeNode)e.Node );
-			}
-			else
-				this.Close();
-		}
-
-		public void DisplayProperties( )
-		{
-			DisplayProperties( this.node );
-		}
-
-		public void DisplayProperties( TestSuiteTreeNode node)
-		{
-			this.node = node;
-			this.test = node.Test;
-			this.result = node.Result;
-
-			SetTitleBarText();
-
-			categories.Items.Clear();
-			foreach( string cat in test.Categories )
-				categories.Items.Add( cat );
-
-			testResult.Text = node.StatusText;
-			testName.Text = test.TestName.Name;
-
-			testType.Text = node.TestType;
-			fullName.Text = test.TestName.FullName;
-			switch( test.RunState )
-			{
-				case RunState.Explicit:
-					shouldRun.Text = "Explicit";
-					break;
-				case RunState.Runnable:
-					shouldRun.Text = "Yes";
-					break;
-				default:
-					shouldRun.Text = "No";
-					break;
-			}
-			description.Text = test.Description;
-			ignoreReason.Text = test.IgnoreReason;
-			testCaseCount.Text = test.TestCount.ToString();
-			properties.Items.Clear();
-            foreach (DictionaryEntry entry in test.Properties)
-            {
-                if (entry.Value is ICollection)
+    public partial class TestPropertiesDialog : Form
+    {
+        private TestSuiteTreeNode node;
+        private ITest test;
+        private TestResult result;
+        private int maxY;
+        private int nextY;
+        private int clientWidth;
+
+        private Image pinnedImage;
+        private Image unpinnedImage;
+
+        public TestPropertiesDialog(TestSuiteTreeNode node)
+        {
+            InitializeComponent();
+
+            this.node = node;
+        }
+
+        #region Properties
+
+        [Browsable(false)]
+        public bool Pinned
+        {
+            get { return pinButton.Checked; }
+            set { pinButton.Checked = value; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        public void DisplayProperties()
+        {
+            DisplayProperties(this.node);
+        }
+
+        public void DisplayProperties(TestSuiteTreeNode node)
+        {
+            this.node = node;
+            this.test = node.Test;
+            this.result = node.Result;
+
+            SetTitleBarText();
+
+            testResult.Text = node.StatusText;
+            testResult.Font = new Font(this.Font, FontStyle.Bold);
+            if (node.TestType == "Project" || node.TestType == "Assembly")
+                testName.Text = Path.GetFileName(test.TestName.Name);
+            else
+                testName.Text = test.TestName.Name;
+
+            testType.Text = node.TestType;
+            fullName.Text = test.TestName.FullName;
+            description.Text = test.Description;
+
+            StringBuilder sb1 = new StringBuilder();
+            foreach (string cat in test.Categories)
+                if (sb1.Length > 0)
                 {
-                    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() );
+                    sb1.Append(", ");
+                    sb1.Append(cat);
                 }
-                else
-                    properties.Items.Add( entry.Key.ToString() + "=" + entry.Value.ToString());
+            categories.Text = sb1.ToString();
+
+            testCaseCount.Text = test.TestCount.ToString();
+
+            switch (test.RunState)
+            {
+                case RunState.Explicit:
+                    shouldRun.Text = "Explicit";
+                    break;
+                case RunState.Runnable:
+                    shouldRun.Text = "Yes";
+                    break;
+                default:
+                    shouldRun.Text = "No";
+                    break;
             }
+            ignoreReason.Text = test.IgnoreReason;
+
+            FillPropertyList();
 
-			message.Text = "";
-			elapsedTime.Text = "Execution Time:";
-			assertCount.Text = "Assert Count:";
-			stackTrace.Text = "";
+            elapsedTime.Text = "Execution Time:";
+            assertCount.Text = "Assert Count:";
+            message.Text = "";
+            stackTrace.Text = "";
+
+            if (result != null)
+            {
+                elapsedTime.Text = string.Format("Execution Time: {0}", result.Time);
 
-			if ( result != null )
-			{
-				// message may have a leading blank line
-				// TODO: take care of this in label?
+                assertCount.Text = string.Format("Assert Count: {0}", result.AssertCount);
+                // message may have a leading blank line
+                // TODO: take care of this in label?
                 if (result.Message != null)
                 {
                     if (result.Message.Length > 64000)
@@ -557,65 +118,215 @@ namespace NUnit.UiKit
                         message.Text = TrimLeadingBlankLines(result.Message);
                 }
 
-				elapsedTime.Text = string.Format( "Execution Time: {0}", result.Time );
-				assertCount.Text = string.Format( "Assert Count: {0}", result.AssertCount );
-				stackTrace.Text = result.StackTrace;
-			}
-		}
-
-		private string TrimLeadingBlankLines( string s )
-		{
-			if ( s == null ) return s;
-
-			int start = 0;
-			for( int i = 0; i < s.Length; i++ )
-			{
-				switch( s[i] )
-				{
-					case ' ':
-					case '\t':
-						break;
-					case '\r':
-					case '\n':
-						start = i + 1;
-						break;
-
-					default:
-						goto getout;
-				}
-			}
-
-			getout:
-			return start == 0 ? s : s.Substring( start );
-		}
-
-		protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
-		{
-			const int ESCAPE = 27;
-			const int WM_CHAR = 258;
-
-			if (m.Msg == WM_CHAR && m.WParam.ToInt32() == ESCAPE )
-			{
-				this.Close();
-				return true;
-			}
-
-			return base.ProcessKeyEventArgs( ref m ); 
-		}
-
-		private void pinButton_Click(object sender, System.EventArgs e)
-		{
-			if ( pinButton.Checked )
-				pinButton.Image = pinnedImage;
-			else
-				pinButton.Image = unpinnedImage;
-		}
-
-		private void pinButton_CheckedChanged(object sender, System.EventArgs e)
-		{
-		
-		}
-	}
-
-	#endregion
+                stackTrace.Text = result.StackTrace;
+            }
+
+            BeginPanel();
+
+            CreateRow(testTypeLabel, testType);
+            CreateRow(fullNameLabel, fullName);
+            CreateRow(descriptionLabel, description);
+            CreateRow(categoriesLabel, categories);
+            CreateRow(testCaseCountLabel, testCaseCount, shouldRunLabel, shouldRun);
+            CreateRow(ignoreReasonLabel, ignoreReason);
+            CreateRow(propertiesLabel, properties);
+            CreateRow(hiddenProperties);
+
+            groupBox1.ClientSize = new Size(
+                groupBox1.ClientSize.Width, maxY + 12);
+
+            groupBox2.Location = new Point(
+                groupBox1.Location.X, groupBox1.Bottom + 12);
+
+            BeginPanel();
+
+            CreateRow(elapsedTime, assertCount);
+            CreateRow(messageLabel, message);
+            CreateRow(stackTraceLabel, stackTrace);
+
+            groupBox2.ClientSize = new Size(
+                groupBox2.ClientSize.Width, this.maxY + 12);
+
+            this.ClientSize = new Size(
+                this.ClientSize.Width, groupBox2.Bottom + 12);
+        }
+
+        private void FillPropertyList()
+        {
+            properties.Items.Clear();
+            foreach (DictionaryEntry entry in test.Properties)
+            {
+                if (hiddenProperties.Checked || !entry.Key.ToString().StartsWith("_"))
+                {
+                    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());
+                }
+            }
+        }
+
+        #endregion
+
+        #region Event Handlers and Overrides
+
+        private void TestPropertiesDialog_Load(object sender, System.EventArgs e)
+        {
+            pinnedImage = new Bitmap(typeof(TestPropertiesDialog), "Images.pinned.gif");
+            unpinnedImage = new Bitmap(typeof(TestPropertiesDialog), "Images.unpinned.gif");
+            pinButton.Image = unpinnedImage;
+
+            if (!this.DesignMode)
+                DisplayProperties();
+
+            node.TreeView.AfterSelect += new TreeViewEventHandler(OnSelectedNodeChanged);
+        }
+
+        private void pinButton_Click(object sender, System.EventArgs e)
+        {
+            if (pinButton.Checked)
+                pinButton.Image = pinnedImage;
+            else
+                pinButton.Image = unpinnedImage;
+        }
+
+        private void TestPropertiesDialog_SizeChanged(object sender, EventArgs e)
+        {
+            if (clientWidth != this.ClientSize.Width)
+            {
+				if (this.node != null)
+                	this.DisplayProperties();
+                clientWidth = this.ClientSize.Width;
+            }
+        }
+
+        private void TestPropertiesDialog_ResizeEnd(object sender, EventArgs e)
+        {
+            this.ClientSize = new Size(
+                this.ClientSize.Width, groupBox2.Bottom + 12);
+
+            clientWidth = this.ClientSize.Width;
+        }
+
+        private void OnSelectedNodeChanged(object sender, TreeViewEventArgs e)
+        {
+            if (pinButton.Checked)
+            {
+                DisplayProperties((TestSuiteTreeNode)e.Node);
+            }
+            else
+                this.Close();
+        }
+
+        protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
+        {
+            const int ESCAPE = 27;
+            const int WM_CHAR = 258;
+
+            if (m.Msg == WM_CHAR && m.WParam.ToInt32() == ESCAPE)
+            {
+                this.Close();
+                return true;
+            }
+
+            return base.ProcessKeyEventArgs(ref m);
+        }
+
+        private void hiddenProperties_CheckedChanged(object sender, EventArgs e)
+        {
+            FillPropertyList();
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private void SetTitleBarText()
+        {
+            string name = test.TestName.Name;
+            int index = name.LastIndexOfAny(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
+            if (index >= 0)
+                name = name.Substring(index + 1);
+            this.Text = string.Format("{0} Properties - {1}", node.TestType, name);
+        }
+
+        private void BeginPanel()
+        {
+            this.maxY = 20;
+            this.nextY = 24;
+        }
+
+        private void SizeToFitText(Label label)
+        {
+            string text = label.Text;
+            if (text == "") 
+                text = "Ay"; // Include descender to be sure of size
+
+            Graphics g = Graphics.FromHwnd(label.Handle);
+            SizeF size = g.MeasureString(text, label.Font, label.Parent.ClientSize.Width - label.Left - 8);
+            label.ClientSize = new Size(
+                (int)Math.Ceiling(size.Width), (int)Math.Ceiling(size.Height));
+        }
+
+        private void CreateRow(params Control[] controls)
+        {
+            this.nextY = this.maxY + 4;
+
+            foreach (Control control in controls)
+            {
+                InsertInRow(control);
+            }
+        }
+
+        private void InsertInRow(Control control)
+        {
+            Label label = control as Label;
+            if (label != null)
+                SizeToFitText(label);
+
+            control.Location = new Point(control.Location.X, this.nextY);
+            this.maxY = Math.Max(this.maxY, control.Bottom);
+        }
+
+        private string TrimLeadingBlankLines(string s)
+        {
+            if (s == null) return s;
+
+            int start = 0;
+            for (int i = 0; i < s.Length; i++)
+            {
+                switch (s[i])
+                {
+                    case ' ':
+                    case '\t':
+                        break;
+                    case '\r':
+                    case '\n':
+                        start = i + 1;
+                        break;
+
+                    default:
+                        goto getout;
+                }
+            }
+
+        getout:
+            return start == 0 ? s : s.Substring(start);
+        }
+
+        #endregion
+    }
 }
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.resx b/src/GuiComponents/UiKit/TestPropertiesDialog.resx
index ff31a6d..bdbccdf 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.resx
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.resx
@@ -117,4 +117,91 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="testResult.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="pinButton.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="testName.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="hiddenProperties.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="description.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="categories.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="properties.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="propertiesLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="testCaseCount.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ignoreReason.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ignoreReasonLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="testCaseCountLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="shouldRun.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="shouldRunLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="testType.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="testTypeLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="categoriesLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="descriptionLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="fullName.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="fullNameLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="assertCount.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="messageLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="elapsedTime.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="stackTraceLabel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="message.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="stackTrace.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeNode.cs b/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
index fe16c73..d7cfb80 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
+++ b/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
@@ -12,7 +12,7 @@ namespace NUnit.UiKit
 	using NUnit.Core;
 	using NUnit.Util;
 
-	/// <summary>
+    /// <summary>
 	/// Type safe TreeNode for use in the TestSuiteTreeView. 
 	/// NOTE: Hides some methods and properties of base class.
 	/// </summary>
@@ -35,6 +35,8 @@ namespace NUnit.UiKit
 		/// </summary>
 		private bool included = true;
 
+        private bool showFailedAssumptions = false;
+
 		/// <summary>
 		/// Image indices for various test states - the values 
 		/// must match the indices of the image list used
@@ -94,6 +96,14 @@ namespace NUnit.UiKit
 			}
 		}
 
+        /// <summary>
+        /// Return true if the node has a result, otherwise false.
+        /// </summary>
+        public bool HasResult
+        {
+            get { return this.result != null; }
+        }
+
 		public string TestType
 		{
 			get { return test.TestType; }
@@ -119,6 +129,40 @@ namespace NUnit.UiKit
 				this.ForeColor = included ? SystemColors.WindowText : Color.LightBlue;
 			}
 		}
+
+        public bool ShowFailedAssumptions
+        {
+            get { return showFailedAssumptions; }
+            set
+            {
+                if (value != showFailedAssumptions)
+                {
+                    showFailedAssumptions = value;
+
+                    if (HasInconclusiveResults)
+                        RepopulateTheoryNode();
+                }
+            }
+        }
+
+        public bool HasInconclusiveResults
+        {
+            get
+            {
+                bool hasInconclusiveResults = false;
+                if (Result != null)
+                {
+                    foreach (TestResult result in Result.Results)
+                    {
+                        hasInconclusiveResults |= result.ResultState == ResultState.Inconclusive;
+                        if (hasInconclusiveResults)
+                            break;
+                    }
+                }
+                return hasInconclusiveResults;
+            }
+        }
+
 		#endregion
 
 		#region Methods
@@ -137,46 +181,91 @@ namespace NUnit.UiKit
 		public void ClearResults()
 		{
 			this.result = null;
-			ImageIndex = SelectedImageIndex = InitIndex;
+			ImageIndex = SelectedImageIndex = CalcImageIndex();
 
 			foreach(TestSuiteTreeNode node in Nodes)
 				node.ClearResults();
 		}
 
-		/// <summary>
+        /// <summary>
+        /// Gets the Theory node associated with the current
+        /// node. If the current node is a Theory, then the
+        /// current node is returned. Otherwise, if the current
+        /// node is a test case under a theory node, then that
+        /// node is returned. Otherwise, null is returned.
+        /// </summary>
+        /// <returns></returns>
+        public TestSuiteTreeNode GetTheoryNode()
+        {
+            if (this.Test.TestType == "Theory")
+                return this;
+
+            TestSuiteTreeNode parent = this.Parent as TestSuiteTreeNode;
+            if (parent != null && parent.Test.TestType == "Theory")
+                return parent;
+
+            return null;
+        }
+
+        /// <summary>
+        /// Regenerate the test cases under a theory, respecting
+        /// the current setting for ShowFailedAssumptions
+        /// </summary>
+        public void RepopulateTheoryNode()
+        {
+            // Ignore if it's not a theory or if it has not been run yet
+            if (this.Test.TestType == "Theory" && this.HasResult)
+            {
+                Nodes.Clear();
+
+                foreach (TestResult result in Result.Results)
+                    if (showFailedAssumptions || result.ResultState != ResultState.Inconclusive)
+                        Nodes.Add(new TestSuiteTreeNode(result));
+            }
+        }
+
+        /// <summary>
 		/// Calculate the image index based on the node contents
 		/// </summary>
 		/// <returns>Image index for this node</returns>
 		private int CalcImageIndex()
 		{
-			if ( this.result == null )
-				return InitIndex;
-			
-			switch( this.result.ResultState )
-			{
-                case ResultState.Inconclusive:
-			        return InconclusiveIndex;
-                case ResultState.Skipped:
-					return SkippedIndex;
-                case ResultState.NotRunnable:
-                case ResultState.Failure:
-                case ResultState.Error:
-                case ResultState.Cancelled:
-			        return FailureIndex;
-				case ResultState.Ignored:
-					return IgnoredIndex;
-				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;
-                default:
-			        return InitIndex;
+            if (this.result == null)
+            {
+                switch (this.test.RunState)
+                {
+                    case RunState.Ignored:
+                        return IgnoredIndex;
+                    case RunState.NotRunnable:
+                        return FailureIndex;
+                    default:
+                        return InitIndex;
+                }
+            }
+            else
+            {
+                switch (this.result.ResultState)
+                {
+                    case ResultState.Inconclusive:
+                        return InconclusiveIndex;
+                    case ResultState.Skipped:
+                        return SkippedIndex;
+                    case ResultState.NotRunnable:
+                    case ResultState.Failure:
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+                        return FailureIndex;
+                    case ResultState.Ignored:
+                        return IgnoredIndex;
+                    case ResultState.Success:
+                        foreach (TestSuiteTreeNode node in this.Nodes)
+                            if (node.ImageIndex == IgnoredIndex)
+                                return IgnoredIndex;
+
+                        return SuccessIndex;
+                    default:
+                        return InitIndex;
+                }
             }
 		}
 
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeView.cs b/src/GuiComponents/UiKit/TestSuiteTreeView.cs
index d483d97..4b3c069 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeView.cs
+++ b/src/GuiComponents/UiKit/TestSuiteTreeView.cs
@@ -8,6 +8,7 @@ using System;
 using System.IO;
 using System.Drawing;
 using System.Collections;
+using System.Collections.Generic;
 using System.Diagnostics;
 using System.Windows.Forms;
 using System.ComponentModel;
@@ -108,6 +109,8 @@ namespace NUnit.UiKit
 
 		private bool fixtureLoaded = false;
 
+        private bool showInconclusiveResults = false;
+
 		#endregion
 
 		#region Construction and Initialization
@@ -119,21 +122,36 @@ namespace NUnit.UiKit
 			this.ContextMenu = new System.Windows.Forms.ContextMenu();
 			this.ContextMenu.Popup += new System.EventHandler( ContextMenu_Popup );
 
-			// See if there are any overriding images in the directory;
             LoadAlternateImages();
+
+            Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
 		}
 
+        private void UserSettings_Changed(object sender, SettingsEventArgs args)
+        {
+            if (args.SettingName == "Gui.TestTree.AlternateImageSet")
+            {
+                LoadAlternateImages();
+                Invalidate();
+            }
+        }
+
         private void LoadAlternateImages()
         {
-            string[] imageNames = { "Skipped", "Failure", "Success", "Ignored", "Inconclusive" };
+            string imageSet = Services.UserSettings.GetSetting("Gui.TestTree.AlternateImageSet") as string;
+
+            if (imageSet != null)
+            {
+                string[] imageNames = { "Skipped", "Failure", "Success", "Ignored", "Inconclusive" };
 
-            for (int index = 0; index < imageNames.Length; index++)
-                LoadAlternateImage(index, imageNames[index]);
+                for (int index = 0; index < imageNames.Length; index++)
+                    LoadAlternateImage(index, imageNames[index], imageSet);
+            }
         }
 
-        private void LoadAlternateImage(int index, string name)
+        private void LoadAlternateImage(int index, string name, string imageSet)
         {
-            string imageDir = Path.GetDirectoryName(PathUtils.GetAssemblyPath(Assembly.GetExecutingAssembly()));
+            string imageDir = PathUtils.Combine(Assembly.GetExecutingAssembly(), "Images", "Tree", imageSet);
 
             string[] extensions = { ".png", ".jpg" };
 
@@ -244,7 +262,8 @@ namespace NUnit.UiKit
                         {
                             suppressEvents = true;
                             visualState.ShowCheckBoxes = this.CheckBoxes;
-                            RestoreVisualState( visualState );
+                            //RestoreVisualState( visualState );
+                            visualState.Restore(this);
                         }
                         finally
                         {
@@ -255,6 +274,11 @@ namespace NUnit.UiKit
             }
         }
 
+        public bool ShowInconclusiveResults
+        {
+            get { return showInconclusiveResults; }
+        }
+
 		/// <summary>
 		/// The currently selected test.
 		/// </summary>
@@ -378,11 +402,7 @@ namespace NUnit.UiKit
 		{
 			TestNode test = e.Test as TestNode;
 			if ( test != null )
-			{
 				Invoke( new LoadHandler( Reload ), new object[]{ test } );
-				if ( Services.UserSettings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
-					ClearAllResults();
-			}
 		}
 
 		private void OnTestUnloaded( object sender, TestEventArgs e)
@@ -487,55 +507,31 @@ namespace NUnit.UiKit
 					runCommandEnabled = false;
 
 				MenuItem runMenuItem = new MenuItem( "&Run", new EventHandler( runMenuItem_Click ) );
-				runMenuItem.DefaultItem = runMenuItem.Enabled = runCommandEnabled & targetNode.Included;
+				runMenuItem.DefaultItem = runMenuItem.Enabled = runCommandEnabled && targetNode.Included &&
+                    (targetNode.Test.RunState == RunState.Runnable || targetNode.Test.RunState == RunState.Explicit);
 		
 				this.ContextMenu.MenuItems.Add( runMenuItem );
 
-				MenuItem runAllMenuItem = new MenuItem( "Run &All", new EventHandler( runAllMenuItem_Click ) );
-				runAllMenuItem.Enabled = runCommandEnabled;
-
-				this.ContextMenu.MenuItems.Add( runAllMenuItem );
-
-				MenuItem runFailedMenuItem = new MenuItem( "Run &Failed", new EventHandler( runFailedMenuItem_Click ) );
-                TestResult result = loader.TestResult;
-			    runFailedMenuItem.Enabled = runCommandEnabled && result != null &&
-			        (result.ResultState == ResultState.Failure || 
-                     result.ResultState == ResultState.Error);
-
-				this.ContextMenu.MenuItems.Add( runFailedMenuItem );
-
-				this.ContextMenu.MenuItems.Add( "-" );
+                this.ContextMenu.MenuItems.Add("-");
 			}
 
-			MenuItem showCheckBoxesMenuItem = new MenuItem( "Show CheckBoxes", new EventHandler( showCheckBoxesMenuItem_Click ) );
-			showCheckBoxesMenuItem.Checked = this.CheckBoxes;
-			this.ContextMenu.MenuItems.Add( showCheckBoxesMenuItem );
-			this.ContextMenu.MenuItems.Add( "-" );
+            TestSuiteTreeNode theoryNode = targetNode.GetTheoryNode();
+            if (theoryNode != null)
+            {
+                MenuItem failedAssumptionsMenuItem = new MenuItem("Show Failed Assumptions", new EventHandler(failedAssumptionsMenuItem_Click));
+                failedAssumptionsMenuItem.Checked = theoryNode.ShowFailedAssumptions;
+                this.ContextMenu.MenuItems.Add(failedAssumptionsMenuItem);
 
-			if ( targetNode.Nodes.Count > 0 )
-			{
-				if ( targetNode.IsExpanded )
-				{
-					MenuItem collapseMenuItem = new MenuItem( 
-						"&Collapse", new EventHandler( collapseMenuItem_Click ) );
-					collapseMenuItem.DefaultItem = !runCommandEnabled;
+                this.ContextMenu.MenuItems.Add("-");
+            }
 
-					this.ContextMenu.MenuItems.Add( collapseMenuItem );
-				}
-				else
-				{
-					MenuItem expandMenuItem = new MenuItem(
-						"&Expand", new EventHandler( expandMenuItem_Click ) );
-					expandMenuItem.DefaultItem = !runCommandEnabled;
-					this.ContextMenu.MenuItems.Add( expandMenuItem );
-				}
-			}
 
-			this.ContextMenu.MenuItems.Add( "Expand All", new EventHandler( expandAllMenuItem_Click ) );
-			this.ContextMenu.MenuItems.Add( "Collapse All", new EventHandler( collapseAllMenuItem_Click ) );
-			this.ContextMenu.MenuItems.Add( "-" );
-			
-			MenuItem loadFixtureMenuItem = new MenuItem( "Load Fixture", new EventHandler( loadFixtureMenuItem_Click ) );
+            MenuItem showCheckBoxesMenuItem = new MenuItem("Show CheckBoxes", new EventHandler(showCheckBoxesMenuItem_Click));
+            showCheckBoxesMenuItem.Checked = this.CheckBoxes;
+            this.ContextMenu.MenuItems.Add(showCheckBoxesMenuItem);
+            this.ContextMenu.MenuItems.Add("-");
+
+            MenuItem loadFixtureMenuItem = new MenuItem("Load Fixture", new EventHandler(loadFixtureMenuItem_Click));
 			loadFixtureMenuItem.Enabled = targetNode.Test.IsSuite && targetNode != Nodes[0];
 			this.ContextMenu.MenuItems.Add( loadFixtureMenuItem );
 
@@ -593,7 +589,22 @@ namespace NUnit.UiKit
 				this.SelectedNode = this.Nodes[0];	
 		}
 
-		/// <summary>
+        private void failedAssumptionsMenuItem_Click(object sender, System.EventArgs e)
+        {
+            TestSuiteTreeNode targetNode = contextNode != null ? contextNode : (TestSuiteTreeNode)SelectedNode;
+            TestSuiteTreeNode theoryNode = targetNode != null ? targetNode.GetTheoryNode() : null;
+            if (theoryNode != null)
+            {
+                MenuItem item = (MenuItem)sender;
+
+                BeginUpdate();
+                item.Checked = !item.Checked;
+                theoryNode.ShowFailedAssumptions = item.Checked;
+                EndUpdate();
+            }
+        }
+
+        /// <summary>
 		/// When Run context menu item is clicked, run the test that
 		/// was selected when the right click was done.
 		/// </summary>
@@ -828,32 +839,15 @@ namespace NUnit.UiKit
 		/// <param name="test">Test suite to be loaded</param>
 		public void Reload( TestNode 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();
-                }
+            TestResult result = ((TestSuiteTreeNode)Nodes[0]).Result;
+            VisualState visualState = new VisualState(this);
 
-                reloadOK = true;
-            }
-            catch (TreeStructureChangedException)
-            {
-            }
+            Load(test);
 
-            // The tree has changed, probably due to settings
-            // changes, so just load it cleanly.
-            if ( !reloadOK )
-                Load(test);
+            visualState.Restore(this);
 
-            this.Focus();
+            if (result != null && !Services.UserSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
+                RestoreResults(result);
 		}
 
 		/// <summary>
@@ -901,20 +895,24 @@ namespace NUnit.UiKit
 		/// <param name="result">The result of the test</param>
 		public void SetTestResult(TestResult result)
 		{
-			TestSuiteTreeNode node = this[result];	
-			if ( node == null )
-				throw new ArgumentException( "Test not found in tree: " + result.Test.TestName.UniqueName );
+			TestSuiteTreeNode node = this[result];
+            if (node == null)
+            {
+                Debug.WriteLine("Test not found in tree: " + result.Test.TestName.UniqueName);
+            }
+            else
+            {
+                node.Result = result;
 
-			if ( result.Test.TestName.FullName != node.Test.TestName.FullName )
-				throw( new ArgumentException("Attempting to set Result with a value that refers to a different test") );
-			
-			node.Result = result;
+                if (result.Test.TestType == "Theory")
+                    node.RepopulateTheoryNode();
 
-			if ( DisplayTestProgress && node.IsVisible )
-			{
-				Invalidate( node.Bounds );
-				Update();
-			}
+                if (DisplayTestProgress && node.IsVisible)
+                {
+                    Invalidate(node.Bounds);
+                    Update();
+                }
+            }
 		}
 
 		public void HideTests()
@@ -937,6 +935,7 @@ namespace NUnit.UiKit
 				Form owner = this.FindForm();
 				propertiesDialog = new TestPropertiesDialog( node );
 				propertiesDialog.Owner = owner;
+                propertiesDialog.Font = owner.Font;
 				propertiesDialog.StartPosition = FormStartPosition.Manual;
 				propertiesDialog.Left = Math.Max(0, owner.Left + ( owner.Width - propertiesDialog.Width ) / 2);
 				propertiesDialog.Top = Math.Max(0, owner.Top + ( owner.Height - propertiesDialog.Height ) / 2);
@@ -970,10 +969,18 @@ namespace NUnit.UiKit
 
 		#region Running Tests
 
-		public void RunAllTests()
+        public void RunAllTests()
+        {
+            RunAllTests(true);
+        }
+
+		public void RunAllTests(bool ignoreCategories)
 		{
-			runCommandEnabled = false;
-			RunTests( new ITest[] { ((TestSuiteTreeNode)Nodes[0]).Test }, true );
+            if (Nodes.Count > 0)
+            {
+                runCommandEnabled = false;
+                RunTests(new ITest[] { ((TestSuiteTreeNode)Nodes[0]).Test }, ignoreCategories);
+            }
 		}
 
 		public void RunSelectedTests()
@@ -990,12 +997,16 @@ namespace NUnit.UiKit
 
 		private void RunTests( ITest[] tests, bool ignoreCategories )
 		{
-			runningTests = tests;
+            if (tests != null && tests.Length > 0)
+            {
+                runningTests = tests;
 
-			if ( ignoreCategories )
-				loader.RunTests( MakeNameFilter( tests ) );
-			else
-				loader.RunTests( MakeFilter( tests ) );
+                ITestFilter filter = ignoreCategories
+                    ? MakeNameFilter(tests)
+                    : MakeFilter(tests);
+
+                loader.RunTests(filter);
+            }
 		}
 
 		private TestFilter MakeFilter( ITest[] tests )
@@ -1111,171 +1122,6 @@ namespace NUnit.UiKit
 		}
 
 		/// <summary>
-		/// Helper routine that compares a node with a test
-		/// </summary>
-		/// <param name="node">Node to compare</param>
-		/// <param name="test">Test to compare</param>
-		/// <returns>True if the test has the same name</returns>
-		private bool Match( TestSuiteTreeNode node, TestNode test )
-		{
-			return node.Test.TestName.FullName == test.TestName.FullName;
-		}
-
-		/// <summary>
-		/// A node has been matched with a test, so update it
-		/// and then process child nodes and tests recursively.
-		/// If a child was added or removed, then this node
-		/// will expand itself.
-		/// </summary>
-		/// <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, IList deletedNodes )
-		{
-			if ( node.Test.TestName.FullName != test.TestName.FullName )
-				throw( new TreeStructureChangedException( 
-					string.Format( "Attempting to update {0} with {1}", node.Test.TestName.FullName, test.TestName.FullName ) ) );
-
-			treeMap.Remove( node.Test.TestName.UniqueName );
-			node.Test = test;
-			treeMap.Add( test.TestName.UniqueName, node );
-			
-			if ( !test.IsSuite )
-				return false;
-
-			bool showChildren = UpdateNodes( node.Nodes, test.Tests, deletedNodes );
-
-			if ( showChildren ) node.Expand();
-
-			return showChildren;
-		}
-
-		/// <summary>
-		/// Match a set of nodes against a set of tests.
-		/// Remove nodes that are no longer represented
-		/// in the tests. Update any nodes that match.
-		/// Add new nodes for new tests.
-		/// </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, IList deletedNodes )
-		{
-			// 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;
-
-            // 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 ( !IsTestInList( node.Test, tests ) )
-				{
-					log.Debug( "Deleting " + node.Test.TestName.Name );
-                    deletedNodes.Add(node);
-					RemoveNode( node );
-					showChanges = true;
-				}
-			}
-
-			// Pass2: All nodes in the node list are also
-			// in the tests, so we can merge in changes
-			// and add any new nodes.
-			nodeIndex = 0;
-			foreach( TestNode test in tests )
-			{
-				TestSuiteTreeNode node = nodeIndex < nodes.Count ? (TestSuiteTreeNode)nodes[nodeIndex] : null;
-
-				if ( node != null && node.Test.TestName.FullName == test.TestName.FullName )
-					UpdateNode( node, test, deletedNodes );
-				else
-				{
-                    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++;
-			}
-
-			return showChanges;
-		}
-
-		/// <summary>
-		/// 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">Test to examine</param>
-		/// <param name="tests">List of tests to match against</param>
-		private bool IsTestInList( ITest test, IList tests )
-		{
-			foreach ( ITest candidate in tests )
-				if( candidate.TestName.FullName == test.TestName.FullName )
-					return true;
-
-			return false;
-		}
-
-		/// <summary>
 		/// Delegate for use in invoking the tree loader
 		/// from the watcher thread.
 		/// </summary>
@@ -1289,18 +1135,18 @@ namespace NUnit.UiKit
 		/// <param name="node">Node under which to collapse fixtures</param>
 		private void HideTestsUnderNode( TestSuiteTreeNode node )
 		{
-			bool expand = false;
-			foreach( TestSuiteTreeNode child in node.Nodes )
-				if ( child.Test.IsSuite )
-				{
-					expand = true;
-					HideTestsUnderNode( child );
-				}
+            if (node.Test.IsSuite)
+            {
+                if (node.Test.TestType == "TestFixture")
+                    node.Collapse();
+                else
+                {
+                    node.Expand();
 
-			if ( expand )
-				node.Expand();
-			else
-				node.Collapse();
+                    foreach (TestSuiteTreeNode child in node.Nodes)
+                        HideTestsUnderNode(child);
+                }
+            }
 		}
 
 		/// <summary>
@@ -1343,28 +1189,14 @@ namespace NUnit.UiKit
 			SelectedNode.EnsureVisible();
 		}
 
-        /// <summary>
-        /// Try to set the TopNode of the tree. The TopNode setter
-        /// is only supported in .Net 2.0 and higher, so we must
-        /// use reflection. If it's not available we simply
-        /// make the node visible.
-        /// </summary>
-        /// <param name="node"></param>
-        public void TryToSetTopNode(TreeNode node)
-        {
-            MethodInfo setMethod = null;
-            PropertyInfo property = this.GetType().GetProperty("TopNode");
-            if (property != null)
-                setMethod = property.GetSetMethod();
-            if (setMethod != null)
-                setMethod.Invoke(this, new object[] { node });
-            else
-                node.EnsureVisible();
-        }
-
 		private TestSuiteTreeNode FindNode( ITest test )
 		{
-			return treeMap[test.TestName.UniqueName] as TestSuiteTreeNode;
+			TestSuiteTreeNode node = treeMap[test.TestName.UniqueName] as TestSuiteTreeNode;
+
+            if (node == null)
+                node = FindNodeByName(test.TestName.FullName);
+
+            return node;
 		}
 
         private TestSuiteTreeNode FindNodeByName( string fullName )
@@ -1387,70 +1219,45 @@ namespace NUnit.UiKit
                 string fileName = VisualState.GetVisualStateFileName(loader.TestFileName);
                 if (File.Exists(fileName))
                 {
-                    RestoreVisualState(VisualState.LoadFrom(fileName));
+                    VisualState.LoadFrom(fileName).Restore(this);
                 }
             }
         }
 
-        private void RestoreVisualState( VisualState visualState )
+        private void RestoreResults(TestResult result)
         {
-            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 (result.HasResults)
+                foreach (TestResult childResult in result.Results)
+                    RestoreResults(childResult);
 
-            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;
-            }
+            SetTestResult(result);
+        }
 
-            this.Select();
-		}
 		#endregion
-
 	}
 
 	#region Helper Classes
-	internal class ClearCheckedNodesVisitor : TestSuiteTreeNodeVisitor
+
+    #region ClearCheckedNodesVisitor
+
+    internal class ClearCheckedNodesVisitor : TestSuiteTreeNodeVisitor
 	{
 		public override void Visit(TestSuiteTreeNode node)
 		{
 			node.Checked = false;
 		}
 
-	}
+    }
+
+    #endregion
+
+    #region CheckFailedNodesVisitor
 
-	internal class CheckFailedNodesVisitor : TestSuiteTreeNodeVisitor 
+    internal class CheckFailedNodesVisitor : TestSuiteTreeNodeVisitor 
 	{
 		public override void Visit(TestSuiteTreeNode node)
 		{
-			if (!node.Test.IsSuite && node.Result != null && 
+			if (!node.Test.IsSuite && node.HasResult && 
                 (node.Result.ResultState == ResultState.Failure || 
                  node.Result.ResultState == ResultState.Error) )
 			{
@@ -1461,36 +1268,37 @@ namespace NUnit.UiKit
 				node.Checked = false;
 		
 		}
-	}
+    }
 
-	internal class FailedTestsFilterVisitor : TestSuiteTreeNodeVisitor
-	{
-		NUnit.Core.Filters.NameFilter filter = new NameFilter();
-		ArrayList tests = new ArrayList();
+    #endregion
 
-		public TestFilter Filter
-		{
-			get { return filter; }
-		}
+    #region FailedTestsFilterVisitor
+
+    internal class FailedTestsFilterVisitor : TestSuiteTreeNodeVisitor
+	{
+		List<ITest> tests = new List<ITest>();
 
 		public ITest[] Tests
 		{
-			get { return (ITest[])tests.ToArray(typeof(ITest)); }
+			get { return tests.ToArray(); }
 		}
 
 		public override void Visit(TestSuiteTreeNode node)
 		{
-			if (!node.Test.IsSuite && node.Result != null && 
+			if (!node.Test.IsSuite && node.HasResult && 
                     (node.Result.ResultState == ResultState.Failure || 
                      node.Result.ResultState == ResultState.Error) )
 			{
 				tests.Add(node.Test);
-				filter.Add(node.Test.TestName);
 			}
 		}
-	}
+    }
+
+    #endregion
 
-	public class TestFilterVisitor : TestSuiteTreeNodeVisitor
+    #region TestFilterVisitor
+
+    public class TestFilterVisitor : TestSuiteTreeNodeVisitor
 	{
 		private ITestFilter filter;
 
@@ -1503,9 +1311,13 @@ namespace NUnit.UiKit
 		{
 			node.Included = filter.Pass( node.Test );
 		}
-	}
+    }
 
-	internal class CheckedTestFinder
+    #endregion
+
+    #region CheckedTestFinder
+
+    internal class CheckedTestFinder
 	{
 		[Flags]
 		public enum SelectionFlags
@@ -1516,7 +1328,7 @@ namespace NUnit.UiKit
 			All = Top + Sub
 		}
 
-		private ArrayList checkedTests = new ArrayList();
+		private List<CheckedTestInfo> checkedTests = new List<CheckedTestInfo>();
 		private struct CheckedTestInfo
 		{
 			public ITest Test;
@@ -1578,7 +1390,10 @@ namespace NUnit.UiKit
 			foreach( TestSuiteTreeNode node in nodes )
 				FindCheckedNodes( node, topLevel );
 		}
-	}
-	#endregion
+    }
+
+    #endregion
+
+    #endregion
 }
 
diff --git a/src/GuiComponents/UiKit/TestTree.cs b/src/GuiComponents/UiKit/TestTree.cs
index 862a137..1faef4b 100644
--- a/src/GuiComponents/UiKit/TestTree.cs
+++ b/src/GuiComponents/UiKit/TestTree.cs
@@ -584,9 +584,14 @@ namespace NUnit.UiKit
 		#endregion
 
 
-		public void RunAllTests()
+        public void RunAllTests()
+        {
+            RunAllTests(true);
+        }
+
+		public void RunAllTests(bool ignoreTests)
 		{
-			tests.RunAllTests();
+			tests.RunAllTests(ignoreTests);
 		}
 
 		public void RunSelectedTests()
@@ -603,9 +608,14 @@ namespace NUnit.UiKit
 		{
 			if (availableList.SelectedItems.Count > 0) 
 			{
-				ArrayList categories = new ArrayList(availableList.SelectedItems);
-				foreach ( string category in categories ) 
-				{
+                // Create a separate list to avoid exception
+                // when using the list box directly.
+                List<string> categories = new List<string>();
+				foreach ( string category in availableList.SelectedItems ) 
+                    categories.Add(category);
+
+                foreach ( string category in categories)
+                {
 					selectedList.Items.Add(category);
 					availableList.Items.Remove(category);
 				}
@@ -620,7 +630,12 @@ namespace NUnit.UiKit
 		{
 			if (selectedList.SelectedItems.Count > 0) 
 			{
-				ArrayList categories = new ArrayList(selectedList.SelectedItems);
+                // Create a separate list to avoid exception
+                // when using the list box directly.
+                List<string> categories = new List<string>();
+                foreach (string category in selectedList.SelectedItems)
+                    categories.Add(category);
+
 				foreach ( string category in categories )
 				{
 					selectedList.Items.Remove(category);
diff --git a/src/GuiComponents/UiKit/TextBoxDisplay.cs b/src/GuiComponents/UiKit/TextBoxDisplay.cs
index 71680da..c81fb1b 100644
--- a/src/GuiComponents/UiKit/TextBoxDisplay.cs
+++ b/src/GuiComponents/UiKit/TextBoxDisplay.cs
@@ -9,6 +9,7 @@ using System.Drawing;
 using System.ComponentModel;
 using NUnit.Core;
 using NUnit.Util;
+using System.Diagnostics;
 
 namespace NUnit.UiKit
 {
@@ -94,7 +95,7 @@ namespace NUnit.UiKit
 		private string pendingTestCaseLabel = null;
 		private void OnTestOutput( object sender, TestEventArgs e )
 		{
-			if ( WantOutputType( e.TestOutput.Type ) )
+			if ( ShouldInclude(e.TestOutput.Type) )
 			{
 				if ( pendingTestCaseLabel != null )
 				{
@@ -106,35 +107,45 @@ namespace NUnit.UiKit
 			}
 		}
 
-		private bool WantOutputType( TestOutputType type )
-		{
-			TextDisplayContent mask = TextDisplayContent.Empty;
-			switch( type )
-			{
-				case TestOutputType.Out:
-					mask = TextDisplayContent.Out;
-					break;
-				case TestOutputType.Error:
-					mask = TextDisplayContent.Error;
-					break;
-				case TestOutputType.Trace:
-					mask = TextDisplayContent.Trace;
-					break;
-				case TestOutputType.Log:
-					mask = TextDisplayContent.Log;
-					break;
-			}
-
-			return ((int)mask & (int)this.content) != 0;
-		}
+        // TODO: We determine whether to include output
+        // based solely on the output type. This works
+        // well for everything but logging. Because we
+        // are unable - at this stage of processing - 
+        // to determine the logging level of the output
+        // all tabs displaying log output will show
+        // output at the most verbose level specified
+        // on any of the tabs. Since it's not likely
+        // that anyone will display logging on multiple
+        // tabs, this is not seen as a serious issue.
+        // It may be resolved in a future release by
+        // limiting the options available when specifying
+        // the content of the output displayed.
+        private bool ShouldInclude(TestOutputType type)
+        {
+            switch (type)
+            {
+                default:
+                case TestOutputType.Out:
+                    return content.Out;
+
+                case TestOutputType.Error:
+                    return content.Error;
+
+                case TestOutputType.Log:
+                    return true;// content.LogLevel != LoggingThreshold.Off;
+
+                case TestOutputType.Trace:
+                    return content.Trace;
+            }
+        }
 
 		private void OnTestStarting(object sender, TestEventArgs args)
 		{
-			if ( (this.content & TextDisplayContent.Labels) != 0 )
+			if (this.content.Labels != TestLabelLevel.Off)
 			{
 				string label = string.Format( "***** {0}", args.TestName.FullName );
 
-				if ( (this.content & TextDisplayContent.LabelOnlyOnOutput) != 0 )
+				if (this.content.Labels == TestLabelLevel.On)
 					this.pendingTestCaseLabel = label;
 				else
 					WriteLine(label);
diff --git a/src/GuiComponents/UiKit/TextDisplay.cs b/src/GuiComponents/UiKit/TextDisplay.cs
index caae3bf..e1afbd6 100644
--- a/src/GuiComponents/UiKit/TextDisplay.cs
+++ b/src/GuiComponents/UiKit/TextDisplay.cs
@@ -10,18 +10,6 @@ using NUnit.Core;
 
 namespace NUnit.UiKit
 {
-	[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
 	/// controls - that display text.
diff --git a/src/GuiComponents/UiKit/TextDisplayContent.cs b/src/GuiComponents/UiKit/TextDisplayContent.cs
new file mode 100644
index 0000000..e9635b1
--- /dev/null
+++ b/src/GuiComponents/UiKit/TextDisplayContent.cs
@@ -0,0 +1,121 @@
+// ****************************************************************
+// Copyright 2012, 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.Text;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+    public class TextDisplayContent
+    {
+        private char[] content = new char[] { '0', '0', '0', '0', '0' };
+
+        public TextDisplayContent()
+        {
+        }
+
+        public bool Out 
+        {
+            get { return content[0] == '1'; }
+            set { content[0] = value ? '1' : '0'; } 
+        }
+
+        public bool Error
+        {
+            get { return content[1] == '1'; }
+            set { content[1] = value ? '1' : '0'; } 
+        }
+
+        public bool Trace
+        {
+            get { return content[2] == '1'; }
+            set { content[2] = value ? '1' : '0'; }
+        }
+
+        public LoggingThreshold LogLevel
+        {
+            get { return (LoggingThreshold)(content[3] - '0'); }
+            set { content[3] = (char)((int)value + '0'); }
+        }
+
+        public TestLabelLevel Labels
+        {
+            get { return (TestLabelLevel)(content[4] - '0'); }
+            set { content[4] = (char)((int)value + '0'); }
+        }
+
+        public static TextDisplayContent FromSettings(string name)
+        {
+            TextDisplayContent content = new TextDisplayContent();
+            content.LoadSettings(name);
+            return content;
+        }
+
+        public void LoadSettings(string name)
+        {
+            ISettings settings = Services.UserSettings;
+            string prefix = "Gui.TextOutput." + name;
+
+            string rep = settings.GetSetting(prefix + ".Content", "00000");
+
+            // Assume new format but if it isn't try the old one
+            if (!LoadUsingNewFormat(rep))
+                LoadUsingOldFormat(rep);                
+        }
+
+        private bool LoadUsingNewFormat(string rep)
+        {
+            if (rep.Length != 5) return false;
+
+            foreach (char c in rep)
+                if (!char.IsDigit(c))
+                    return false;
+
+            this.content = rep.ToCharArray();
+
+            return true;
+        }
+
+        private void LoadUsingOldFormat(string content)
+        {
+            ContentType contentType = (ContentType)System.Enum.Parse(typeof(ContentType), content, false);
+            this.Out = (contentType & ContentType.Out) != 0;
+            this.Error = (contentType & ContentType.Error) != 0;
+            this.Trace = (contentType & ContentType.Trace) != 0;
+            this.LogLevel = (contentType & ContentType.Log) != 0
+                ? LoggingThreshold.All
+                : LoggingThreshold.Off;
+            this.Labels = (contentType & ContentType.Labels) != 0
+                ? (contentType & ContentType.LabelOnlyOnOutput) != 0
+                    ? TestLabelLevel.All
+                    : TestLabelLevel.On
+                : TestLabelLevel.Off;
+        }
+
+        [Flags]
+        private enum ContentType
+        {
+            Empty = 0,
+            Out = 1,
+            Error = 2,
+            Trace = 4,
+            Log = 8,
+            Labels = 64,
+            LabelOnlyOnOutput = 128
+        }
+
+        public void SaveSettings(string name)
+        {
+            ISettings settings = Services.UserSettings;
+            string prefix = "Gui.TextOutput." + name;
+
+            settings.SaveSetting(prefix + ".Content", new string(content));
+        }
+    }
+}
diff --git a/src/GuiComponents/UiKit/TextDisplayTabSettings.cs b/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
index f031fb9..4e81841 100644
--- a/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
+++ b/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
@@ -5,6 +5,7 @@
 // ****************************************************************
 using System;
 using System.Collections;
+using NUnit.Util;
 
 namespace NUnit.UiKit
 {
@@ -38,8 +39,10 @@ namespace NUnit.UiKit
 						break;
 
 					TabInfo tab = new TabInfo( name, text );
-					tab.Content = (TextDisplayContent)settings.GetSetting(prefix + ".Content", TextDisplayContent.Empty );
+
+                    tab.Content = TextDisplayContent.FromSettings(name);
 					tab.Enabled = settings.GetSetting( prefix + ".Enabled", true );
+
 					info.Add( tab );
 				}
 			}
@@ -55,13 +58,10 @@ namespace NUnit.UiKit
 			tabInfo = new TabInfoCollection();
 
             TabInfo tab = tabInfo.AddNewTab("Text Output");
-		    tab.Content =
-		        TextDisplayContent.Out |
-		        TextDisplayContent.Error |
-		        TextDisplayContent.Trace |
-		        TextDisplayContent.Log |
-		        TextDisplayContent.Labels |
-		        TextDisplayContent.LabelOnlyOnOutput;
+		    tab.Content = new TextDisplayContent();
+            tab.Content.Out = true;
+            tab.Content.Error = true;
+            tab.Content.Labels = TestLabelLevel.On;
 		    tab.Enabled = true;
         }
 
@@ -77,8 +77,8 @@ namespace NUnit.UiKit
 				string prefix = Prefix + tab.Name;
 
 				settings.SaveSetting( prefix + ".Title", tab.Title );
-				settings.SaveSetting( prefix + ".Content", tab.Content );
 				settings.SaveSetting( prefix + ".Enabled", tab.Enabled );
+                tab.Content.SaveSettings(tab.Name);
 			}
 
 			string oldNames = settings.GetSetting( Prefix + "TabList", string.Empty );
@@ -96,41 +96,39 @@ namespace NUnit.UiKit
 		public TabInfoCollection Tabs
 		{
 			get { return tabInfo; }
-		}
-	
-		public class TabInfo
-		{
-			public string Name;
-			public string Title;
-			public TextDisplayContent Content = TextDisplayContent.Empty;
-			public bool Enabled = true;
+        }
+
+        #region Nested TabInfo Class
 
+        public class TabInfo
+		{
 			public TabInfo( string name, string title )
 			{
 				this.Name = name;
 				this.Title = title;
+                this.Enabled = true;
+                this.Content = new TextDisplayContent();
 			}
-		}
 
-		public class TabInfoCollection : CollectionBase
-		{
-			public void Add( TabInfo tabInfo )
-			{
-				InnerList.Add( tabInfo );
-			}
+            public string Name { get; set; }
+            public string Title { get; set; }
+            public TextDisplayContent Content { get; set; }
+            public bool Enabled { get; set; }
+        }
 
+        #endregion
+
+        #region Nested TabInfoCollectionClass
+
+        public class TabInfoCollection : System.Collections.Generic.List<TabInfo>
+		{
 			public TabInfo AddNewTab( string title )
 			{
 				TabInfo tabInfo = new TabInfo( GetNextName(), title );
-				InnerList.Add( tabInfo );
+                this.Add(tabInfo);
 				return tabInfo;
 			}
 
-			public void Insert( int index, TabInfo tabInfo )
-			{
-				InnerList.Insert(index, tabInfo);
-			}
-
 			private string GetNextName()
 			{
 				for( int i = 0;;i++ )
@@ -141,17 +139,11 @@ namespace NUnit.UiKit
 				}
 			}
 
-			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 )
+					foreach ( TabInfo info in this )
 						if ( info.Name == name )
 							return info;
 
@@ -163,6 +155,8 @@ namespace NUnit.UiKit
 			{
 				return this[name] != null;
 			}
-		}
-	}
+        }
+
+        #endregion
+    }
 }
diff --git a/src/GuiComponents/UiKit/TextOutputSettingsPage.cs b/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
index bc15b2c..eb61c45 100644
--- a/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
+++ b/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
@@ -10,6 +10,8 @@ using System.Drawing;
 using System.Windows.Forms;
 using NUnit.Core;
 using NUnit.UiKit;
+using NUnit.Util;
+using System.Diagnostics;
 
 namespace NUnit.UiKit
 {
@@ -17,24 +19,23 @@ namespace NUnit.UiKit
 	{
 		private System.Windows.Forms.Label label1;
 		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.GroupBox groupBox2;
 		private System.Windows.Forms.CheckBox showStandardOutput;
-		private System.Windows.Forms.CheckBox showErrorOutput;
-		private System.Windows.Forms.CheckBox showTraceOutput;
-		private System.Windows.Forms.CheckBox showLogOutput;
+        private System.Windows.Forms.CheckBox showErrorOutput;
 		private System.Windows.Forms.ComboBox tabSelectComboBox;
-		private System.Windows.Forms.Button useDefaultsButton;
-		private System.Windows.Forms.CheckBox testCaseLabels;
-		private System.Windows.Forms.CheckBox suppressLabelsIfNoOutput;
+        private System.Windows.Forms.Button useDefaultsButton;
 		private System.ComponentModel.IContainer components = null;
 		private System.Windows.Forms.TextBox textBox1;
 		private System.Windows.Forms.Label label5;
 
 		private TextDisplayTabSettings tabSettings = new TextDisplayTabSettings();
 		private System.Windows.Forms.CheckBox enabledCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
+        private System.Windows.Forms.HelpProvider helpProvider1;
+        private Label label6;
+        private ComboBox logLevelComboBox;
+        private Label label3;
+        private ComboBox labelsComboBox;
+        private CheckBox showTraceOutput;
 		private int selectedTabIndex = -1;
 
 		public TextOutputSettingsPage(string key) : base(key)
@@ -42,7 +43,13 @@ namespace NUnit.UiKit
 			// This call is required by the Windows Form Designer.
 			InitializeComponent();
 
-			// TODO: Add any initialization after the InitializeComponent call
+            logLevelComboBox.Items.Clear();
+            foreach (string name in System.Enum.GetNames(typeof(LoggingThreshold)))
+                logLevelComboBox.Items.Add(name);
+
+            labelsComboBox.Items.Clear();
+            foreach (string name in System.Enum.GetNames(typeof(TestLabelLevel)))
+                labelsComboBox.Items.Add(name);
 		}
 
 		/// <summary>
@@ -67,215 +74,215 @@ namespace NUnit.UiKit
 		/// </summary>
 		private void InitializeComponent()
 		{
-			this.label1 = new System.Windows.Forms.Label();
-			this.label2 = new System.Windows.Forms.Label();
-			this.showStandardOutput = new System.Windows.Forms.CheckBox();
-			this.showErrorOutput = new System.Windows.Forms.CheckBox();
-			this.showTraceOutput = new System.Windows.Forms.CheckBox();
-			this.showLogOutput = new System.Windows.Forms.CheckBox();
-			this.testCaseLabels = new System.Windows.Forms.CheckBox();
-			this.tabSelectComboBox = new System.Windows.Forms.ComboBox();
-			this.groupBox2 = new System.Windows.Forms.GroupBox();
-			this.useDefaultsButton = new System.Windows.Forms.Button();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.label3 = new System.Windows.Forms.Label();
-			this.suppressLabelsIfNoOutput = new System.Windows.Forms.CheckBox();
-			this.textBox1 = new System.Windows.Forms.TextBox();
-			this.enabledCheckBox = new System.Windows.Forms.CheckBox();
-			this.label5 = new System.Windows.Forms.Label();
-			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-			this.SuspendLayout();
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(8, 16);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(72, 16);
-			this.label1.TabIndex = 11;
-			this.label1.Text = "Select Tab:";
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(8, 104);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(104, 16);
-			this.label2.TabIndex = 16;
-			this.label2.Text = "Content";
-			// 
-			// showStandardOutput
-			// 
-			this.helpProvider1.SetHelpString(this.showStandardOutput, "If checked, standard Console output is displayed on this Tab.");
-			this.showStandardOutput.Location = new System.Drawing.Point(40, 128);
-			this.showStandardOutput.Name = "showStandardOutput";
-			this.helpProvider1.SetShowHelp(this.showStandardOutput, true);
-			this.showStandardOutput.Size = new System.Drawing.Size(136, 24);
-			this.showStandardOutput.TabIndex = 17;
-			this.showStandardOutput.Text = "Standard Output";
-			this.showStandardOutput.CheckedChanged += new System.EventHandler(this.showStandardOutput_CheckedChanged);
-			// 
-			// showErrorOutput
-			// 
-			this.helpProvider1.SetHelpString(this.showErrorOutput, "If checked, error output is displayed on this Tab.");
-			this.showErrorOutput.Location = new System.Drawing.Point(200, 128);
-			this.showErrorOutput.Name = "showErrorOutput";
-			this.helpProvider1.SetShowHelp(this.showErrorOutput, true);
-			this.showErrorOutput.Size = new System.Drawing.Size(128, 24);
-			this.showErrorOutput.TabIndex = 18;
-			this.showErrorOutput.Text = "Error Output";
-			this.showErrorOutput.CheckedChanged += new System.EventHandler(this.showErrorOutput_CheckedChanged);
-			// 
-			// showTraceOutput
-			// 
-			this.helpProvider1.SetHelpString(this.showTraceOutput, "If checked, Trace output is displayed on this Tab.");
-			this.showTraceOutput.Location = new System.Drawing.Point(40, 160);
-			this.showTraceOutput.Name = "showTraceOutput";
-			this.helpProvider1.SetShowHelp(this.showTraceOutput, true);
-			this.showTraceOutput.Size = new System.Drawing.Size(120, 24);
-			this.showTraceOutput.TabIndex = 19;
-			this.showTraceOutput.Text = "Trace Output";
-			this.showTraceOutput.CheckedChanged += new System.EventHandler(this.showTraceOutput_CheckedChanged);
-			// 
-			// showLogOutput
-			// 
-			this.helpProvider1.SetHelpString(this.showLogOutput, "If checked, log output is displayed on this Tab.");
-			this.showLogOutput.Location = new System.Drawing.Point(200, 160);
-			this.showLogOutput.Name = "showLogOutput";
-			this.helpProvider1.SetShowHelp(this.showLogOutput, true);
-			this.showLogOutput.Size = new System.Drawing.Size(120, 24);
-			this.showLogOutput.TabIndex = 20;
-			this.showLogOutput.Text = "Log Output";
-			this.showLogOutput.CheckedChanged += new System.EventHandler(this.showLogOutput_CheckedChanged);
-			// 
-			// testCaseLabels
-			// 
-			this.helpProvider1.SetHelpString(this.testCaseLabels, "If checked, each test case is preceded by an identifying label.");
-			this.testCaseLabels.Location = new System.Drawing.Point(40, 224);
-			this.testCaseLabels.Name = "testCaseLabels";
-			this.helpProvider1.SetShowHelp(this.testCaseLabels, true);
-			this.testCaseLabels.Size = new System.Drawing.Size(184, 24);
-			this.testCaseLabels.TabIndex = 21;
-			this.testCaseLabels.Text = "Display TestCase Labels";
-			this.testCaseLabels.CheckedChanged += new System.EventHandler(this.testCaseLabels_CheckedChanged);
-			// 
-			// tabSelectComboBox
-			// 
-			this.tabSelectComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.tabSelectComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-			this.helpProvider1.SetHelpString(this.tabSelectComboBox, "Allows the user to select an existing Tab, create a new Tab or edit the list of T" +
-				"abs.");
-			this.tabSelectComboBox.Location = new System.Drawing.Point(88, 16);
-			this.tabSelectComboBox.Name = "tabSelectComboBox";
-			this.helpProvider1.SetShowHelp(this.tabSelectComboBox, true);
-			this.tabSelectComboBox.Size = new System.Drawing.Size(232, 24);
-			this.tabSelectComboBox.TabIndex = 22;
-			this.tabSelectComboBox.SelectedIndexChanged += new System.EventHandler(this.tabSelectComboBox_SelectedIndexChanged);
-			// 
-			// 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(56, 104);
-			this.groupBox2.Name = "groupBox2";
-			this.groupBox2.Size = new System.Drawing.Size(400, 8);
-			this.groupBox2.TabIndex = 24;
-			this.groupBox2.TabStop = false;
-			// 
-			// useDefaultsButton
-			// 
-			this.useDefaultsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.useDefaultsButton, "Restores the list of Tabs and their content to the default values.");
-			this.useDefaultsButton.Location = new System.Drawing.Point(328, 16);
-			this.useDefaultsButton.Name = "useDefaultsButton";
-			this.helpProvider1.SetShowHelp(this.useDefaultsButton, true);
-			this.useDefaultsButton.Size = new System.Drawing.Size(112, 23);
-			this.useDefaultsButton.TabIndex = 25;
-			this.useDefaultsButton.Text = "Restore Defaults";
-			this.useDefaultsButton.Click += new System.EventHandler(this.button1_Click);
-			// 
-			// 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, 200);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(376, 8);
-			this.groupBox1.TabIndex = 27;
-			this.groupBox1.TabStop = false;
-			// 
-			// label3
-			// 
-			this.label3.Location = new System.Drawing.Point(8, 200);
-			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(104, 16);
-			this.label3.TabIndex = 26;
-			this.label3.Text = "Test Labels";
-			// 
-			// suppressLabelsIfNoOutput
-			// 
-			this.suppressLabelsIfNoOutput.Enabled = false;
-			this.helpProvider1.SetHelpString(this.suppressLabelsIfNoOutput, "If checked, the identifying lablel is only displayed if there is output.");
-			this.suppressLabelsIfNoOutput.Location = new System.Drawing.Point(72, 248);
-			this.suppressLabelsIfNoOutput.Name = "suppressLabelsIfNoOutput";
-			this.helpProvider1.SetShowHelp(this.suppressLabelsIfNoOutput, true);
-			this.suppressLabelsIfNoOutput.Size = new System.Drawing.Size(296, 24);
-			this.suppressLabelsIfNoOutput.TabIndex = 0;
-			this.suppressLabelsIfNoOutput.Text = "Suppress label if no output is displayed";
-			this.suppressLabelsIfNoOutput.CheckedChanged += new System.EventHandler(this.suppressLabelsIfNoOutput_CheckedChanged);
-			// 
-			// textBox1
-			// 
-			this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.textBox1, "The title to be displayed on the selected Tab.");
-			this.textBox1.Location = new System.Drawing.Point(88, 64);
-			this.textBox1.Name = "textBox1";
-			this.helpProvider1.SetShowHelp(this.textBox1, true);
-			this.textBox1.Size = new System.Drawing.Size(232, 22);
-			this.textBox1.TabIndex = 30;
-			this.textBox1.Text = "";
-			this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
-			// 
-			// enabledCheckBox
-			// 
-			this.enabledCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-			this.helpProvider1.SetHelpString(this.enabledCheckBox, "If checked, the Tab is enabled. If not, it is hidden.");
-			this.enabledCheckBox.Location = new System.Drawing.Point(344, 64);
-			this.enabledCheckBox.Name = "enabledCheckBox";
-			this.helpProvider1.SetShowHelp(this.enabledCheckBox, true);
-			this.enabledCheckBox.Size = new System.Drawing.Size(80, 24);
-			this.enabledCheckBox.TabIndex = 31;
-			this.enabledCheckBox.Text = "Enabled";
-			this.enabledCheckBox.CheckedChanged += new System.EventHandler(this.displayTab_CheckedChanged);
-			// 
-			// label5
-			// 
-			this.label5.Location = new System.Drawing.Point(8, 64);
-			this.label5.Name = "label5";
-			this.label5.Size = new System.Drawing.Size(64, 23);
-			this.label5.TabIndex = 32;
-			this.label5.Text = "Title:";
-			// 
-			// TextOutputSettingsPage
-			// 
-			this.Controls.Add(this.label5);
-			this.Controls.Add(this.enabledCheckBox);
-			this.Controls.Add(this.textBox1);
-			this.Controls.Add(this.suppressLabelsIfNoOutput);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.label3);
-			this.Controls.Add(this.useDefaultsButton);
-			this.Controls.Add(this.groupBox2);
-			this.Controls.Add(this.tabSelectComboBox);
-			this.Controls.Add(this.testCaseLabels);
-			this.Controls.Add(this.showLogOutput);
-			this.Controls.Add(this.showTraceOutput);
-			this.Controls.Add(this.showErrorOutput);
-			this.Controls.Add(this.showStandardOutput);
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.label1);
-			this.Name = "TextOutputSettingsPage";
-			this.ResumeLayout(false);
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.showStandardOutput = new System.Windows.Forms.CheckBox();
+            this.showErrorOutput = new System.Windows.Forms.CheckBox();
+            this.tabSelectComboBox = new System.Windows.Forms.ComboBox();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.useDefaultsButton = new System.Windows.Forms.Button();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.enabledCheckBox = new System.Windows.Forms.CheckBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.label6 = new System.Windows.Forms.Label();
+            this.logLevelComboBox = new System.Windows.Forms.ComboBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.labelsComboBox = new System.Windows.Forms.ComboBox();
+            this.showTraceOutput = new System.Windows.Forms.CheckBox();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(8, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(62, 13);
+            this.label1.TabIndex = 11;
+            this.label1.Text = "Select Tab:";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(8, 104);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(44, 13);
+            this.label2.TabIndex = 16;
+            this.label2.Text = "Content";
+            // 
+            // showStandardOutput
+            // 
+            this.showStandardOutput.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.showStandardOutput, "If checked, standard Console output is displayed on this Tab.");
+            this.showStandardOutput.Location = new System.Drawing.Point(40, 128);
+            this.showStandardOutput.Name = "showStandardOutput";
+            this.helpProvider1.SetShowHelp(this.showStandardOutput, true);
+            this.showStandardOutput.Size = new System.Drawing.Size(104, 17);
+            this.showStandardOutput.TabIndex = 17;
+            this.showStandardOutput.Text = "Standard Output";
+            this.showStandardOutput.CheckedChanged += new System.EventHandler(this.showStandardOutput_CheckedChanged);
+            // 
+            // showErrorOutput
+            // 
+            this.showErrorOutput.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.showErrorOutput, "If checked, error output is displayed on this Tab.");
+            this.showErrorOutput.Location = new System.Drawing.Point(242, 128);
+            this.showErrorOutput.Name = "showErrorOutput";
+            this.helpProvider1.SetShowHelp(this.showErrorOutput, true);
+            this.showErrorOutput.Size = new System.Drawing.Size(83, 17);
+            this.showErrorOutput.TabIndex = 18;
+            this.showErrorOutput.Text = "Error Output";
+            this.showErrorOutput.CheckedChanged += new System.EventHandler(this.showErrorOutput_CheckedChanged);
+            // 
+            // tabSelectComboBox
+            // 
+            this.tabSelectComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.tabSelectComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.helpProvider1.SetHelpString(this.tabSelectComboBox, "Allows the user to select an existing Tab, create a new Tab or edit the list of T" +
+                    "abs.");
+            this.tabSelectComboBox.Location = new System.Drawing.Point(105, 14);
+            this.tabSelectComboBox.Name = "tabSelectComboBox";
+            this.helpProvider1.SetShowHelp(this.tabSelectComboBox, true);
+            this.tabSelectComboBox.Size = new System.Drawing.Size(195, 21);
+            this.tabSelectComboBox.TabIndex = 22;
+            this.tabSelectComboBox.SelectedIndexChanged += new System.EventHandler(this.tabSelectComboBox_SelectedIndexChanged);
+            // 
+            // 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(131, 104);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(325, 8);
+            this.groupBox2.TabIndex = 24;
+            this.groupBox2.TabStop = false;
+            // 
+            // useDefaultsButton
+            // 
+            this.useDefaultsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.useDefaultsButton.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.useDefaultsButton, "Restores the list of Tabs and their content to the default values.");
+            this.useDefaultsButton.Location = new System.Drawing.Point(329, 12);
+            this.useDefaultsButton.Name = "useDefaultsButton";
+            this.helpProvider1.SetShowHelp(this.useDefaultsButton, true);
+            this.useDefaultsButton.Size = new System.Drawing.Size(112, 23);
+            this.useDefaultsButton.TabIndex = 25;
+            this.useDefaultsButton.Text = "Restore Defaults";
+            this.useDefaultsButton.Click += new System.EventHandler(this.button1_Click);
+            // 
+            // textBox1
+            // 
+            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.helpProvider1.SetHelpString(this.textBox1, "The title to be displayed on the selected Tab.");
+            this.textBox1.Location = new System.Drawing.Point(105, 64);
+            this.textBox1.Name = "textBox1";
+            this.helpProvider1.SetShowHelp(this.textBox1, true);
+            this.textBox1.Size = new System.Drawing.Size(215, 20);
+            this.textBox1.TabIndex = 30;
+            this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
+            // 
+            // enabledCheckBox
+            // 
+            this.enabledCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.enabledCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.enabledCheckBox, "If checked, the Tab is enabled. If not, it is hidden.");
+            this.enabledCheckBox.Location = new System.Drawing.Point(350, 64);
+            this.enabledCheckBox.Name = "enabledCheckBox";
+            this.helpProvider1.SetShowHelp(this.enabledCheckBox, true);
+            this.enabledCheckBox.Size = new System.Drawing.Size(65, 17);
+            this.enabledCheckBox.TabIndex = 31;
+            this.enabledCheckBox.Text = "Enabled";
+            this.enabledCheckBox.CheckedChanged += new System.EventHandler(this.displayTab_CheckedChanged);
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(8, 64);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(30, 13);
+            this.label5.TabIndex = 32;
+            this.label5.Text = "Title:";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(239, 161);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(63, 13);
+            this.label6.TabIndex = 35;
+            this.label6.Text = "Log Output:";
+            // 
+            // logLevelComboBox
+            // 
+            this.logLevelComboBox.FormattingEnabled = true;
+            this.helpProvider1.SetHelpString(this.logLevelComboBox, "Selects the logging threshold for display on this Tab.");
+            this.logLevelComboBox.Location = new System.Drawing.Point(329, 161);
+            this.logLevelComboBox.Name = "logLevelComboBox";
+            this.helpProvider1.SetShowHelp(this.logLevelComboBox, true);
+            this.logLevelComboBox.Size = new System.Drawing.Size(77, 21);
+            this.logLevelComboBox.TabIndex = 36;
+            this.logLevelComboBox.SelectedIndexChanged += new System.EventHandler(this.logLevel_SelectedIndexChanged);
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(37, 200);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(92, 13);
+            this.label3.TabIndex = 37;
+            this.label3.Text = "Test Case Labels:";
+            // 
+            // labelsComboBox
+            // 
+            this.labelsComboBox.FormattingEnabled = true;
+            this.helpProvider1.SetHelpString(this.labelsComboBox, "Selects whether test case labels are displayed. Option \'On\' displays labels only " +
+                    "when there is other output from the test.");
+            this.labelsComboBox.Items.AddRange(new object[] {
+            "Off",
+            "On",
+            "All"});
+            this.labelsComboBox.Location = new System.Drawing.Point(176, 200);
+            this.labelsComboBox.Name = "labelsComboBox";
+            this.helpProvider1.SetShowHelp(this.labelsComboBox, true);
+            this.labelsComboBox.Size = new System.Drawing.Size(77, 21);
+            this.labelsComboBox.TabIndex = 38;
+            this.labelsComboBox.SelectedIndexChanged += new System.EventHandler(this.labelsComboBox_SelectedIndexChanged);
+            // 
+            // showTraceOutput
+            // 
+            this.showTraceOutput.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.showTraceOutput, "If checked, trace output is displayed on this Tab.");
+            this.showTraceOutput.Location = new System.Drawing.Point(40, 161);
+            this.showTraceOutput.Name = "showTraceOutput";
+            this.helpProvider1.SetShowHelp(this.showTraceOutput, true);
+            this.showTraceOutput.Size = new System.Drawing.Size(89, 17);
+            this.showTraceOutput.TabIndex = 39;
+            this.showTraceOutput.Text = "Trace Output";
+            this.showTraceOutput.UseVisualStyleBackColor = true;
+            this.showTraceOutput.CheckedChanged += new System.EventHandler(this.showTraceOutput_CheckedChanged);
+            // 
+            // TextOutputSettingsPage
+            // 
+            this.Controls.Add(this.showTraceOutput);
+            this.Controls.Add(this.labelsComboBox);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.logLevelComboBox);
+            this.Controls.Add(this.label6);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.enabledCheckBox);
+            this.Controls.Add(this.textBox1);
+            this.Controls.Add(this.useDefaultsButton);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.tabSelectComboBox);
+            this.Controls.Add(this.showErrorOutput);
+            this.Controls.Add(this.showStandardOutput);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Name = "TextOutputSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
 
 		}
 		#endregion
@@ -283,12 +290,12 @@ namespace NUnit.UiKit
 		public override void LoadSettings()
 		{
 			tabSettings.LoadSettings(settings);
-			InitializeComboBox();
+			InitializeTabSelectComboBox();
 		}
 
-		private void InitializeComboBox()
+		private void InitializeTabSelectComboBox()
 		{
-			FillComboBox();
+			FillTabSelectComboBox();
 
 			if ( this.tabSelectComboBox.Items.Count > 0 )
 			{
@@ -297,7 +304,7 @@ namespace NUnit.UiKit
 			}
 		}
 
-		private void FillComboBox()
+		private void FillTabSelectComboBox()
 		{
 			tabSelectComboBox.Items.Clear();
 
@@ -316,7 +323,7 @@ namespace NUnit.UiKit
 		private void button1_Click(object sender, System.EventArgs e)
 		{
 			tabSettings.LoadDefaults();
-			InitializeComboBox();
+			InitializeTabSelectComboBox();
 		}
 
 		private void InitDisplay(TextDisplayTabSettings.TabInfo tabInfo)
@@ -324,12 +331,11 @@ namespace NUnit.UiKit
 			textBox1.Text = tabInfo.Title;
 
 			TextDisplayContent content = tabInfo.Content;
-			showStandardOutput.Checked = (content & TextDisplayContent.Out) != 0;
-			showErrorOutput.Checked = (content & TextDisplayContent.Error) != 0;
-			showTraceOutput.Checked = (content & TextDisplayContent.Trace) != 0;
-			showLogOutput.Checked = (content & TextDisplayContent.Log) != 0;
-			testCaseLabels.Checked = (content & TextDisplayContent.Labels) != 0;
-			suppressLabelsIfNoOutput.Checked = (content & TextDisplayContent.LabelOnlyOnOutput) != 0;
+            showStandardOutput.Checked = content.Out;
+            showErrorOutput.Checked = content.Error;
+            showTraceOutput.Checked = content.Trace;
+            logLevelComboBox.SelectedIndex = (int)content.LogLevel;
+            labelsComboBox.SelectedIndex = (int)content.Labels;
 
 			enabledCheckBox.Checked = tabInfo.Enabled;
 		}
@@ -360,7 +366,7 @@ namespace NUnit.UiKit
 				this.ParentForm.Site.Container.Add( dlg );
 				if ( dlg.ShowDialog(this) == DialogResult.OK )
 				{
-					FillComboBox();
+					FillTabSelectComboBox();
 					this.tabSelectComboBox.SelectedIndex = tabSettings.Tabs.Count - 1;
 				}
 			}
@@ -373,53 +379,23 @@ namespace NUnit.UiKit
 				this.ParentForm.Site.Container.Add( dlg );
 				dlg.ShowDialog(this);
 
-				FillComboBox();
+				FillTabSelectComboBox();
 					
 				if ( tabSelectComboBox.Items.Count > 0 )
 					tabSelectComboBox.SelectedIndex = selectedTabIndex = 0;
 			}
 		}
 
-		private void testCaseLabels_CheckedChanged(object sender, System.EventArgs e)
-		{
-			suppressLabelsIfNoOutput.Enabled = testCaseLabels.Checked;
-			SetContent( TextDisplayContent.Labels, testCaseLabels.Checked );
-		}
-
-		private void suppressLabelsIfNoOutput_CheckedChanged(object sender, System.EventArgs e)
-		{
-			SetContent( TextDisplayContent.LabelOnlyOnOutput, suppressLabelsIfNoOutput.Checked );
-		}
-
-		private void SetContent( TextDisplayContent mask, bool enable )
-		{
-			int index = tabSelectComboBox.SelectedIndex;
-			if ( enable )
-				tabSettings.Tabs[index].Content |= mask;
-			else
-				tabSettings.Tabs[index].Content &= ~mask;
-		}
-
 		private void showStandardOutput_CheckedChanged(object sender, System.EventArgs e)
 		{
-			SetContent( TextDisplayContent.Out, showStandardOutput.Checked );		
-		}
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Out = showStandardOutput.Checked;
+        }
 
 		private void showErrorOutput_CheckedChanged(object sender, System.EventArgs e)
 		{
-			SetContent( TextDisplayContent.Error, showErrorOutput.Checked );		
-		}
-
-		private void showTraceOutput_CheckedChanged(object sender, System.EventArgs e)
-		{
-			SetContent( TextDisplayContent.Trace, showTraceOutput.Checked );		
-		}
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Error = showErrorOutput.Checked;
+        }
 
-		private void showLogOutput_CheckedChanged(object sender, System.EventArgs e)
-		{
-			SetContent( TextDisplayContent.Log, showLogOutput.Checked );		
-		}
-		
 		private void textBox1_TextChanged(object sender, System.EventArgs e)
 		{
 			tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Title = textBox1.Text;
@@ -429,6 +405,21 @@ namespace NUnit.UiKit
 		{
 			tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Enabled = enabledCheckBox.Checked;
 		}
+
+        private void labelsComboBox_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Labels = (TestLabelLevel)labelsComboBox.SelectedIndex;
+        }
+
+        private void logLevel_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.LogLevel = (LoggingThreshold)logLevelComboBox.SelectedIndex;
+        }
+
+        private void showTraceOutput_CheckedChanged(object sender, EventArgs e)
+        {
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Trace = showTraceOutput.Checked;
+        }
 	}
 }
 
diff --git a/src/GuiComponents/UiKit/TextOutputSettingsPage.resx b/src/GuiComponents/UiKit/TextOutputSettingsPage.resx
index 93be9d7..61bb827 100644
--- a/src/GuiComponents/UiKit/TextOutputSettingsPage.resx
+++ b/src/GuiComponents/UiKit/TextOutputSettingsPage.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,213 +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="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="showStandardOutput.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="showStandardOutput.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showStandardOutput.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showErrorOutput.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="showErrorOutput.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showErrorOutput.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showTraceOutput.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="showTraceOutput.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showTraceOutput.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showLogOutput.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="showLogOutput.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showLogOutput.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testCaseLabels.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testCaseLabels.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testCaseLabels.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabSelectComboBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabSelectComboBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabSelectComboBox.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="useDefaultsButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="useDefaultsButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="useDefaultsButton.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="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="suppressLabelsIfNoOutput.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="suppressLabelsIfNoOutput.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="suppressLabelsIfNoOutput.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="textBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="textBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="textBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="enabledCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="enabledCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="enabledCheckBox.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="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>TextOutputSettingsPage</value>
-  </data>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/UserMessage.cs b/src/GuiComponents/UiKit/UserMessage.cs
deleted file mode 100644
index 54fd5d6..0000000
--- a/src/GuiComponents/UiKit/UserMessage.cs
+++ /dev/null
@@ -1,130 +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.
-// ****************************************************************
-
-using System;
-using System.Text;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for UserMessage.
-	/// </summary>
-	public class UserMessage
-	{
-		private static readonly string nunitCaption = "NUnit";
-
-		public static DialogResult Display( string message )
-		{
-			return Display( message, nunitCaption, MessageBoxButtons.OK, MessageBoxIcon.None );
-		}
-
-		public static DialogResult Display( string message, string caption )
-		{
-			return Display( message, caption, MessageBoxButtons.OK, MessageBoxIcon.None );
-		}
-
-		public static DialogResult Display( string message, MessageBoxButtons buttons )
-		{
-			return Display( message, nunitCaption, buttons, MessageBoxIcon.None );
-		}
-
-		public static DialogResult Display( string message, MessageBoxButtons buttons, MessageBoxIcon icon )
-		{
-			return Display( message, nunitCaption, buttons, icon );
-		}
-
-		public static DialogResult Display( string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon )
-		{
-			return MessageBox.Show( message, caption, buttons, icon );
-		}
-
-		public static DialogResult DisplayFailure( string message )
-		{
-			return DisplayFailure( message, nunitCaption );
-		}
-
-		public static DialogResult DisplayFailure( string message, string caption )
-		{
-			return Display( message, caption, MessageBoxButtons.OK, MessageBoxIcon.Stop );
-		}
-
-		public static DialogResult DisplayFailure( Exception exception, string caption )
-		{
-//			if ( exception is NUnitException )
-//				return DisplayFailure( exception.InnerException, exception.Message, caption );
-//			else
-			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 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 );
-		}
-
-		public static DialogResult DisplayInfo( string message, string caption )
-		{
-			return Display( message, caption, MessageBoxButtons.OK, MessageBoxIcon.Information );
-		}
-
-		public static DialogResult Ask( string message, MessageBoxButtons buttons )
-		{
-			return Ask( message, nunitCaption, buttons );
-		}
-
-		public static DialogResult Ask( string message )
-		{
-			return Ask( message, nunitCaption, MessageBoxButtons.YesNo );
-		}
-
-		public static DialogResult Ask( string message, string caption )
-		{
-			return Display( message, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question );
-		}
-
-		public static DialogResult Ask( string message, string caption, MessageBoxButtons buttons )
-		{
-			return Display( message, caption, buttons, MessageBoxIcon.Question );
-		}
-
-	}
-}
diff --git a/src/GuiComponents/UiKit/UserMessage.resx b/src/GuiComponents/UiKit/UserMessage.resx
deleted file mode 100644
index 6af1353..0000000
--- a/src/GuiComponents/UiKit/UserMessage.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/VisualState.cs b/src/GuiComponents/UiKit/VisualState.cs
index f1df1a9..f19b77b 100644
--- a/src/GuiComponents/UiKit/VisualState.cs
+++ b/src/GuiComponents/UiKit/VisualState.cs
@@ -103,6 +103,7 @@ namespace NUnit.UiKit
 		#endregion
 
 		#region Instance Methods
+
 		public void Save( string fileName )
 		{
 			using ( StreamWriter writer = new StreamWriter( fileName ) )
@@ -116,6 +117,48 @@ namespace NUnit.UiKit
 			XmlSerializer serializer = new XmlSerializer( GetType() );
 			serializer.Serialize( writer, this );
 		}
+
+        public void Restore(TestSuiteTreeView treeView)
+        {
+            treeView.CheckBoxes = this.ShowCheckBoxes;
+
+            foreach (VisualTreeNode visualNode in this.Nodes)
+            {
+                TestSuiteTreeNode treeNode = treeView[visualNode.UniqueName];
+                if (treeNode != null)
+                {
+                    if (treeNode.IsExpanded != visualNode.Expanded)
+                        treeNode.Toggle();
+
+                    treeNode.Checked = visualNode.Checked;
+                }
+            }
+
+            if (this.SelectedNode != null)
+            {
+                TestSuiteTreeNode treeNode = treeView[this.SelectedNode];
+                if (treeNode != null)
+                    treeView.SelectedNode = treeNode;
+            }
+
+            if (this.TopNode != null)
+            {
+                TestSuiteTreeNode treeNode = treeView[this.TopNode];
+                if (treeNode != null)
+                    treeView.TopNode = treeNode;
+            }
+
+            if (this.SelectedCategories != null)
+            {
+                TestFilter filter = new CategoryFilter(this.SelectedCategories.Split(new char[] { ',' }));
+                if (this.ExcludeCategories)
+                    filter = new NotFilter(filter);
+                treeView.CategoryFilter = filter;
+            }
+
+            treeView.Select();
+        }
+
 		#endregion
 	}
 
diff --git a/src/GuiComponents/UiKit/nunit.uikit.build b/src/GuiComponents/UiKit/nunit.uikit.build
index 49501ac..cb84afc 100644
--- a/src/GuiComponents/UiKit/nunit.uikit.build
+++ b/src/GuiComponents/UiKit/nunit.uikit.build
@@ -14,10 +14,12 @@
         <include name="FolderBrowser.cs"/>
         <include name="GuiAttachedConsole.cs"/>
         <include name="GuiTestEventDispatcher.cs"/>
-        <include name="LongRunningOperationDisplay.cs"/>
-        <include name="NotRunTree.cs"/>
+    <include name="IMessageDisplay.cs"/>
+    <include name="LongRunningOperationDisplay.cs"/>
+    <include name="MessageDisplay.cs"/>
+    <include name="NotRunTree.cs"/>
+    <include name="NUnitFormBase.cs"/>
         <include name="ProgressBar.cs"/>
-        <include name="RecentFileMenuHandler.cs"/>
         <include name="RenameConfigurationDialog.cs"/>
         <include name="ResultTabs.cs"/>
         <include name="SettingsDialogBase.cs"/>
@@ -27,11 +29,13 @@
         <include name="StatusBar.cs"/>
         <include name="TabbedSettingsDialog.cs"/>
         <include name="TestLoaderUI.cs"/>
-        <include name="TestPropertiesDialog.cs"/>
-        <include name="TestSuiteTreeNode.cs"/>
-        <include name="TestSuiteTreeView.cs"/>
-        <include name="TestTree.cs"/>
-        <include name="TextBoxDisplay.cs"/>
+    <include name="TestPropertiesDialog.cs"/>
+    <include name="TestPropertiesDialog.Designer.cs"/>
+    <include name="TestSuiteTreeNode.cs"/>
+    <include name="TestSuiteTreeView.cs"/>
+    <include name="TestTree.cs"/>
+    <include name="TextBoxDisplay.cs"/>
+    <include name="TextDisplayContent.cs"/>
         <include name="TextDisplayTabPage.cs"/>
         <include name="TextDisplayTabSettings.cs"/>       
         <include name="TextDisplayWriter.cs"/>
@@ -72,17 +76,13 @@
         <include name="TipWindow.resx"/>
         <include name="TreeBasedSettingsDialog.resx"/>
         <include name="UserMessage.resx"/>
-        <include name="Ellipsis.gif"/>
-        <include name="pinned.gif"/>
-        <include name="unpinned.gif"/>
+        <include name="Images/Ellipsis.gif"/>
+        <include name="Images/pinned.gif"/>
+        <include name="Images/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"/>
+    <include name="Images/**"/>
   </patternset>
 
   <target name="build">
@@ -96,7 +96,7 @@
       <nowarn>
         <warning number="1699" if="${runtime.version>='2.0'}"/>
       </nowarn>
-      <resources prefix="NUnit.UiKit">
+      <resources prefix="NUnit.UiKit" dynamicprefix="true">
         <patternset refid="resource-files"/>
       </resources>
       <references basedir="${current.lib.dir}">
diff --git a/src/GuiComponents/UiKit/nunit.uikit.dll.csproj b/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
index ff3d8b8..9ec2315 100644
--- a/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
+++ b/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
@@ -2,7 +2,7 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
   <PropertyGroup>
     <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -47,7 +47,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -125,16 +125,19 @@
     </Compile>
     <Compile Include="GuiAttachedConsole.cs" />
     <Compile Include="GuiTestEventDispatcher.cs" />
+    <Compile Include="IMessageDisplay.cs" />
     <Compile Include="LongRunningOperationDisplay.cs">
       <SubType>Form</SubType>
     </Compile>
     <Compile Include="NotRunTree.cs">
       <SubType>Component</SubType>
     </Compile>
+    <Compile Include="NUnitFormBase.cs">
+      <SubType>Form</SubType>
+    </Compile>
     <Compile Include="ProgressBar.cs">
       <SubType>Component</SubType>
     </Compile>
-    <Compile Include="RecentFileMenuHandler.cs" />
     <Compile Include="RenameConfigurationDialog.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -159,10 +162,12 @@
     <Compile Include="TabbedSettingsDialog.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Include="TestLoaderUI.cs" />
     <Compile Include="TestPropertiesDialog.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Include="TestPropertiesDialog.Designer.cs">
+      <DependentUpon>TestPropertiesDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="TestSuiteTreeNode.cs" />
     <Compile Include="TestSuiteTreeView.cs">
       <SubType>Component</SubType>
@@ -173,6 +178,7 @@
     <Compile Include="TextBoxDisplay.cs">
       <SubType>Component</SubType>
     </Compile>
+    <Compile Include="TextDisplayContent.cs" />
     <Compile Include="TextDisplay.cs" />
     <Compile Include="TextDisplayTabPage.cs">
       <SubType>Component</SubType>
@@ -188,7 +194,7 @@
     <Compile Include="TreeBasedSettingsDialog.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Include="UserMessage.cs" />
+    <Compile Include="MessageDisplay.cs" />
     <Compile Include="VisualState.cs" />
     <Compile Include="WaitCursor.cs" />
   </ItemGroup>
@@ -263,7 +269,6 @@
     </EmbeddedResource>
     <EmbeddedResource Include="TestPropertiesDialog.resx">
       <DependentUpon>TestPropertiesDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
     </EmbeddedResource>
     <EmbeddedResource Include="TestSuiteTreeView.resx">
       <DependentUpon>TestSuiteTreeView.cs</DependentUpon>
@@ -285,22 +290,73 @@
       <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" />
+    <EmbeddedResource Include="Images\pinned.gif" />
+    <EmbeddedResource Include="Images\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" />
+    <Content Include="Images\Tree\Classic\Ignored.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Ellipsis.gif" />
+    <Content Include="Images\Tree\Circles\Inconclusive.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Circles\Skipped.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Circles\Success.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Circles\Failure.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Circles\Ignored.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Classic\Failure.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Classic\Skipped.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Default\Failure.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Default\Ignored.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Classic\Inconclusive.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Default\Inconclusive.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Default\Skipped.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Classic\Success.jpg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Default\Success.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
   </ItemGroup>
   <ItemGroup>
+    <Content Include="Images\Tree\Visual Studio\Failure.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Visual Studio\Ignored.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Visual Studio\Inconclusive.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Visual Studio\Skipped.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Images\Tree\Visual Studio\Success.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <None Include="nunit.uikit.build" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
diff --git a/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs b/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs
deleted file mode 100644
index 5355399..0000000
--- a/src/GuiComponents/tests/RecentFileMenuHandlerTests.cs
+++ /dev/null
@@ -1,100 +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
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Windows.Forms;
-using NUnit.Framework;
-using NUnit.Util;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class RecentFileMenuHandlerTests
-	{
-		private MenuItem menu;
-		private RecentFiles files;
-		private RecentFileMenuHandler handler;
-		
-		[SetUp]
-		public void SetUp()
-		{
-			menu = new MenuItem();
-			files = new FakeRecentFiles();
-			handler = new RecentFileMenuHandler( menu, files );
-            handler.CheckFilesExist = false;
-        }
-
-		[Test]
-		public void DisableOnLoadWhenEmpty()
-		{
-			handler.Load();
-			Assert.IsFalse( menu.Enabled );
-		}
-
-		[Test]
-		public void EnableOnLoadWhenNotEmpty()
-		{
-			files.SetMostRecent( "Test" );
-			handler.Load();
-			Assert.IsTrue( menu.Enabled );
-		}
-		[Test]
-		public void LoadMenuItems()
-		{
-			files.SetMostRecent( "Third" );
-			files.SetMostRecent( "Second" );
-			files.SetMostRecent( "First" );
-			handler.Load();
-			Assert.AreEqual( 3, menu.MenuItems.Count );
-			Assert.AreEqual( "1 First", menu.MenuItems[0].Text );
-		}
-
-		private class FakeRecentFiles : RecentFiles
-		{
-			private RecentFilesCollection files = new RecentFilesCollection();
-			private int maxFiles = 24;
-
-			public int Count
-			{
-				get { return files.Count; }
-			}
-
-			public int MaxFiles
-			{
-				get { return maxFiles; }
-				set { maxFiles = value; }
-			}
-
-			public void SetMostRecent( string fileName )
-			{
-				SetMostRecent( new RecentFileEntry( fileName ) );
-			}
-
-			public void SetMostRecent( RecentFileEntry entry )
-			{
-				files.Insert( 0, entry );
-			}
-
-			public RecentFilesCollection Entries
-			{
-				get { return files; }
-			}
-
-			public void Clear()
-			{
-				files.Clear();
-			}
-
-			public void Remove( string fileName )
-			{
-				files.Remove( fileName );
-			}
-		}
-	
-		// TODO: Need mock loader to test clicking
-	}
-}
diff --git a/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs b/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
index 7d37e11..af7cbe1 100644
--- a/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
+++ b/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
@@ -61,7 +61,6 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void BuildTreeView()
 		{
-            //treeView.Load( new TestNode( suite ) );
 			Assert.IsNotNull( treeView.Nodes[0] );
 			Assert.AreEqual( MockAssembly.Nodes, treeView.GetNodeCount( true ) );
 			Assert.AreEqual( testsDll, treeView.Nodes[0].Text );	
@@ -148,8 +147,6 @@ namespace NUnit.UiKit.Tests
 		[Test]
 		public void SetTestResult()
 		{
-            //treeView.Load( new TestNode( suite ) );
-			
 			TestSuite fixture = (TestSuite)findTest( "MockTestFixture", suite );		
 			TestResult result = new TestResult( new TestInfo( fixture ) );
 			treeView.SetTestResult( result );
@@ -181,8 +178,6 @@ namespace NUnit.UiKit.Tests
         [Test]
 		public void ProcessChecks()
 		{
-            //treeView.Load( new TestNode( suite ) );
-
 			Assert.AreEqual(0, treeView.CheckedTests.Length);
 			Assert.IsFalse(Checked(treeView.Nodes));
 
diff --git a/src/GuiComponents/tests/nunit.uikit.tests.csproj b/src/GuiComponents/tests/nunit.uikit.tests.csproj
index aaa07f3..2852c1e 100644
--- a/src/GuiComponents/tests/nunit.uikit.tests.csproj
+++ b/src/GuiComponents/tests/nunit.uikit.tests.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -46,7 +46,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -119,7 +119,6 @@
     <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" />
diff --git a/src/GuiException/UiException/nunit.uiexception.dll.csproj b/src/GuiException/UiException/nunit.uiexception.dll.csproj
index 0f48448..ddc2dbc 100644
--- a/src/GuiException/UiException/nunit.uiexception.dll.csproj
+++ b/src/GuiException/UiException/nunit.uiexception.dll.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -19,7 +19,7 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <NoWarn>1699</NoWarn>
@@ -28,7 +28,7 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <NoWarn>1699</NoWarn>
diff --git a/src/GuiException/tests/CSharpParser/TestCSCode.cs b/src/GuiException/tests/CSharpParser/TestCSCode.cs
index 2a394bd..46f2ab0 100644
--- a/src/GuiException/tests/CSharpParser/TestCSCode.cs
+++ b/src/GuiException/tests/CSharpParser/TestCSCode.cs
@@ -5,11 +5,8 @@
 
 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
 {
diff --git a/src/GuiException/tests/CSharpParser/TestCSParser.cs b/src/GuiException/tests/CSharpParser/TestCSParser.cs
index c2b1bbb..884771d 100644
--- a/src/GuiException/tests/CSharpParser/TestCSParser.cs
+++ b/src/GuiException/tests/CSharpParser/TestCSParser.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.CodeFormatters;
 
diff --git a/src/GuiException/tests/CSharpParser/TestLexer.cs b/src/GuiException/tests/CSharpParser/TestLexer.cs
index 073fd42..cda15db 100644
--- a/src/GuiException/tests/CSharpParser/TestLexer.cs
+++ b/src/GuiException/tests/CSharpParser/TestLexer.cs
@@ -4,10 +4,8 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
 using System.Text;
 using NUnit.Framework;
-using NUnit.UiException;
 using NUnit.UiException.CodeFormatters;
 
 namespace NUnit.UiException.Tests.CodeFormatters
diff --git a/src/GuiException/tests/CSharpParser/TestToken.cs b/src/GuiException/tests/CSharpParser/TestToken.cs
index 633509d..b0d1426 100644
--- a/src/GuiException/tests/CSharpParser/TestToken.cs
+++ b/src/GuiException/tests/CSharpParser/TestToken.cs
@@ -3,11 +3,7 @@
 // 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
diff --git a/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs b/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
index de748a0..ab2afc1 100644
--- a/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
+++ b/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
@@ -4,10 +4,8 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
 using System.Text;
 using NUnit.Framework;
-using NUnit.UiException;
 using NUnit.UiException.CodeFormatters;
 
 namespace NUnit.UiException.Tests.CodeFormatters
diff --git a/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs b/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
index 5fb93da..9ee6d10 100644
--- a/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
+++ b/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
@@ -5,7 +5,6 @@
 
 using System;
 using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.CodeFormatters;
 
diff --git a/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs b/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
index d3c1ee4..de8fce0 100644
--- a/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
+++ b/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
@@ -5,7 +5,6 @@
 
 using System;
 using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.CodeFormatters;
 using NUnit.UiException.Tests.data;
@@ -284,9 +283,9 @@ namespace NUnit.UiException.Tests.CodeFormatters
             ICodeFormatter csFormatter;
             FormattedCode exp;
 
-            using (new TestResource("HelloWorld.txt"))
+            using (TestResource resource = new TestResource("HelloWorld.txt"))
             {
-                itemHelloTxt = new ErrorItem("HelloWorld.txt", 1);
+                itemHelloTxt = new ErrorItem(resource.Path, 1);
                 txtFormatter = new PlainTextCodeFormatter();
                 exp = txtFormatter.Format(itemHelloTxt.ReadFile());
                 Assert.That(
@@ -295,9 +294,9 @@ namespace NUnit.UiException.Tests.CodeFormatters
                 FormattedCode.CheckData(exp);
             }
 
-            using (new TestResource("Basic.cs"))
+            using (TestResource resource = new TestResource("Basic.cs"))
             {
-                itemBasicCs = new ErrorItem("Basic.cs", 1);
+                itemBasicCs = new ErrorItem(resource.Path, 1);
                 csFormatter = new CSharpCodeFormatter();
                 exp = csFormatter.Format(itemBasicCs.ReadFile());
                 Assert.That(
diff --git a/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs b/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
index efd3ebb..b35360b 100644
--- a/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
+++ b/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.CodeFormatters;
 
diff --git a/src/GuiException/tests/Controls/TestCodeBox.cs b/src/GuiException/tests/Controls/TestCodeBox.cs
index 7ab8ff7..18c2ac8 100644
--- a/src/GuiException/tests/Controls/TestCodeBox.cs
+++ b/src/GuiException/tests/Controls/TestCodeBox.cs
@@ -3,43 +3,37 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-using System;
-using System.Collections.Generic;
-using System.Text;
+#if NET_3_5 || NET_4_0
+using NSubstitute;
 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]
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
     public class TestCodeBox
     {
         private TestingCodeBox _box;
 
-//        private FormattedCode _emptyText;
         private FormattedCode _someText;
         private FormattedCode _someCode;
 
-        private DynamicMock _mockFormatter;
-        private DynamicMock _mockRenderer;
+        private IFormatterCatalog _mockFormatter;
+        private ICodeRenderer _mockRenderer;
 
         [SetUp]
         public void SetUp()
         {
-            _mockFormatter = new DynamicMock(typeof(IFormatterCatalog));
-            _mockRenderer = new DynamicMock(typeof(ICodeRenderer));
+            _mockFormatter = Substitute.For<IFormatterCatalog>();
+            _mockRenderer = Substitute.For<ICodeRenderer>();
 
-            _box = new TestingCodeBox((IFormatterCatalog)_mockFormatter.MockInstance,
-                                (ICodeRenderer)_mockRenderer.MockInstance);
+            _box = new TestingCodeBox(_mockFormatter, _mockRenderer);
             _box.Width = 150;
             _box.Height = 150;
 
-//            _emptyText = Format("", "");
             _someText = Format("some C# code", "");
             _someCode = Format("some C# code", "C#");
 
@@ -62,21 +56,14 @@ namespace NUnit.UiException.Tests.Controls
         {
             TestingCodeBox box;
 
-            box = new TestingCodeBox(
-                (IFormatterCatalog)_mockFormatter.MockInstance,
-                (ICodeRenderer)_mockRenderer.MockInstance);
+            box = new TestingCodeBox(_mockFormatter, _mockRenderer);
 
-            _mockFormatter.ExpectAndReturn("Format", code, new object[] { code.Text, "" });
-
-            _mockRenderer.ExpectAndReturn("GetDocumentSize", size,
-                new object[] { code, box.RenderingContext.Graphics, box.RenderingContext.Font });
+            _mockFormatter.Format(code.Text, "").Returns(code);
+            _mockRenderer.GetDocumentSize(code, box.RenderingContext.Graphics, box.RenderingContext.Font).Returns(size);
 
             box.Text = code.Text;
             Assert.That(box.Text, Is.EqualTo(code.Text));
 
-            _mockFormatter.Verify();
-            _mockRenderer.Verify();
-
             return (box);
         }
 
@@ -111,29 +98,20 @@ namespace NUnit.UiException.Tests.Controls
             // 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 });
+            _mockFormatter.Format(_someText.Text, "").Returns(_someText);
+            _mockRenderer.GetDocumentSize(_someText, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(100, 100));
 
             _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 });
+            _mockFormatter.Format("", "").Returns(FormattedCode.Empty);
+            _mockRenderer.GetDocumentSize(FormattedCode.Empty, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(0, 0));
 
             _box.Text = null;
-            _mockFormatter.Verify();
-            _mockRenderer.Verify();
 
             Assert.That(_box.Text, Is.EqualTo(""));           
 
@@ -148,11 +126,9 @@ namespace NUnit.UiException.Tests.Controls
             box.Width = 150;
             box.Height = 150;
 
-            _mockRenderer.Expect("DrawToGraphics",
-                new object[] { _someText, box.RenderingContext, new Rectangle(0, 0, 150, 150) });
-
             box.FireOnPaint();
-            _mockRenderer.Verify();
+
+            _mockRenderer.Received().DrawToGraphics(_someText, box.RenderingContext, new Rectangle(0, 0, 150, 150));
 
             return;
         }
@@ -162,21 +138,16 @@ namespace NUnit.UiException.Tests.Controls
         {
             _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 });
+            _mockFormatter.Format(_someCode.Text, "C#").Returns(_someCode);
+            _mockRenderer.GetDocumentSize(_someCode, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(200, 400));
 
             _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 });
+            _mockFormatter.Format(_someCode.Text, "").Returns(_someText);
+            _mockRenderer.GetDocumentSize(_box.FormattedCode, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(100, 100));
 
             _box.Language = null;
             Assert.That(_box.Language, Is.EqualTo(""));
@@ -191,15 +162,11 @@ namespace NUnit.UiException.Tests.Controls
 
             _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 });
+            _mockFormatter.Format(_someCode.Text, "").Returns(_someCode);
+            _mockRenderer.GetDocumentSize(_someCode, _box.RenderingContext.Graphics, courier14).Returns(new SizeF(200, 400));
 
             _box.Font = courier14;
 
-            _mockFormatter.Verify();
-            _mockRenderer.Verify();
-
             Assert.That(_box.RenderingContext.Font, Is.SameAs(_box.Font));
 
             return;
@@ -216,22 +183,18 @@ namespace NUnit.UiException.Tests.Controls
 
             // CurrentLine: 0
 
-            _mockRenderer.ExpectAndReturn("LineIndexToYCoordinate", 0f,
-                new object[] { 0, _box.RenderingContext.Graphics, _box.RenderingContext.Font });
+            _mockRenderer.LineIndexToYCoordinate(0, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(0f);
 
             _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 });
+            _mockRenderer.LineIndexToYCoordinate(7, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(390f);
 
             _box.CurrentLine = 7;
-            _mockRenderer.Verify();
 
             Assert.That(_box.CurrentLine, Is.EqualTo(7));
             Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, -375)));
@@ -591,3 +554,4 @@ namespace NUnit.UiException.Tests.Controls
         #endregion
     } */
 }
+#endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestCodeRenderingContext.cs b/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
index a13165c..63440ab 100644
--- a/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
+++ b/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
@@ -3,9 +3,6 @@
 // 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;
diff --git a/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs b/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
index 7091556..3f32c38 100644
--- a/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
+++ b/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
 using NUnit.UiException.CodeFormatters;
@@ -18,7 +16,6 @@ namespace NUnit.UiException.Tests.Controls
     {
         private ICodeRenderer _renderer;
         private FormattedCode _empty;
-//        private FormattedCode _code;
         private FormattedCode _loremIpsum;
         private FormattedCode _text3x7;
         private CodeRenderingContext _args;
@@ -32,12 +29,6 @@ namespace NUnit.UiException.Tests.Controls
 
             _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" +
diff --git a/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs b/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
index 174933a..c0fdcab 100644
--- a/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
+++ b/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
 using System.Drawing;
diff --git a/src/GuiException/tests/Controls/TestErrorBrowser.cs b/src/GuiException/tests/Controls/TestErrorBrowser.cs
index 2d5ea80..ce2d440 100644
--- a/src/GuiException/tests/Controls/TestErrorBrowser.cs
+++ b/src/GuiException/tests/Controls/TestErrorBrowser.cs
@@ -3,35 +3,26 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
+#if NET_3_5 || NET_4_0
 using System;
-using System.Collections.Generic;
-using System.Text;
+using NSubstitute;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
-using System.Drawing;
 using System.Windows.Forms;
-using NUnit.Mocks;
 
 namespace NUnit.UiException.Tests.Controls
 {
-    [TestFixture]
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
     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;
@@ -81,28 +72,21 @@ namespace NUnit.UiException.Tests.Controls
             // - 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);
+            IErrorDisplay mockTraceDisplay = Substitute.For<IErrorDisplay>();
+            IErrorDisplay mockSourceDisplay = Substitute.For<IErrorDisplay>();
 
             ToolStripButton tracePlugin = new ToolStripButton();
-//            ToolStripItem[] traceOptions = new ToolStripItem[] { };
             Control traceContent = new TextBox();
             
-            mockTraceDisplay.SetReturnValue("Text", "Displays the actual stack trace");
+            mockTraceDisplay.PluginItem.Returns(tracePlugin);
+            mockTraceDisplay.Content.Returns(traceContent);
 
-            // looks like Mock needs a bit enhancements to handle multiple calls
+            _errorBrowser.RegisterDisplay(mockTraceDisplay);
 
-            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();
+            mockTraceDisplay.Received().OnStackTraceChanged(_errorBrowser.StackTraceSource);
 
             Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
-            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay.MockInstance));
+            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay));
             Assert.That(_errorBrowser.LayoutPanel.Content, Is.EqualTo(traceContent));
 
             // test #2: Asks ErrorBrowser to register another instance of IErrorDisplay
@@ -112,40 +96,32 @@ namespace NUnit.UiException.Tests.Controls
             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);
+            mockSourceDisplay.PluginItem.Returns(sourcePluginItem);
 
-            _errorBrowser.RegisterDisplay((IErrorDisplay)mockSourceDisplay.MockInstance);
-            mockSourceDisplay.Verify();
+            _errorBrowser.RegisterDisplay(mockSourceDisplay);
 
             Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
-            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay.MockInstance));
+            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay));
 
             // 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;
+            mockTraceDisplay.PluginItem.Returns(tracePlugin);
+            mockSourceDisplay.Content.Returns(sourceContent);
 
-            mockSourceDisplay.Verify();
-            mockTraceDisplay.Verify();
+            _errorBrowser.Toolbar.SelectedDisplay = mockSourceDisplay;
 
-            Assert.That(_errorBrowser.Toolbar.SelectedDisplay, Is.SameAs(mockSourceDisplay.MockInstance));
+            Assert.That(_errorBrowser.Toolbar.SelectedDisplay, Is.SameAs(mockSourceDisplay));
             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();
+
+            mockTraceDisplay.Received().OnStackTraceChanged(stack);
+            mockSourceDisplay.Received().OnStackTraceChanged(stack);
             
             // clears all renderers
 
@@ -211,3 +187,4 @@ namespace NUnit.UiException.Tests.Controls
         }
     }
 }
+#endif
diff --git a/src/GuiException/tests/Controls/TestErrorList.cs b/src/GuiException/tests/Controls/TestErrorList.cs
index 1703c98..5535e65 100644
--- a/src/GuiException/tests/Controls/TestErrorList.cs
+++ b/src/GuiException/tests/Controls/TestErrorList.cs
@@ -3,36 +3,35 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
+#if NET_3_5 || NET_4_0
 using System;
-using System.Collections.Generic;
-using System.Text;
+using NSubstitute;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
-using NUnit.Mocks;
 using System.Drawing;
 using System.Windows.Forms;
 
 namespace NUnit.UiException.Tests.Controls
 {
-    [TestFixture]
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
     public class TestErrorList
     {
-        private TestingErrorList _list;        
+        private TestingErrorList _list;
         private bool _selectionNotification;
 
         private string _trace1;
         private string _trace2;
 
-        private DynamicMock _mock;
+        private IErrorListRenderer _mockRenderer;
 
         [SetUp]
         public void SetUp()
         {
-            _mock = new DynamicMock(typeof(IErrorListRenderer));
+            _mockRenderer = Substitute.For<IErrorListRenderer>();
 
-            _list = new TestingErrorList((IErrorListRenderer)_mock.MockInstance);
+            _list = new TestingErrorList(_mockRenderer);
 
-            _trace1 = 
+            _trace1 =
                 "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
                 "à ExternClass.ExternMethod()\r\n" +
                 "à AnotherExternClass.AnotherExternMethod()\r\n" +
@@ -111,11 +110,9 @@ namespace NUnit.UiException.Tests.Controls
         {
             Size docSize = new Size(200, 500);
 
-            _mock.ExpectAndReturn("GetDocumentSize", docSize,
-                new object[] { _list.Items, _list.WorkingGraphics });
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
 
             _list.StackTrace = _trace1;
-            _mock.Verify();
             Assert.That(_list.AutoScrollMinSize, Is.EqualTo(new Size(200, 500)));
 
             Assert.That(_list.StackTrace, Is.EqualTo(_trace1));
@@ -123,7 +120,7 @@ namespace NUnit.UiException.Tests.Controls
             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;
         }
 
@@ -224,7 +221,7 @@ namespace NUnit.UiException.Tests.Controls
 
             list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
             list.StackTrace = _trace1;
-            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(93));      
+            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(93));
 
             return;
         }
@@ -237,7 +234,7 @@ namespace NUnit.UiException.Tests.Controls
             // feeding ErrorList with garbage details should make it
             // fail gracefully.
 
-            list.StackTrace = 
+            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" +
@@ -246,7 +243,7 @@ namespace NUnit.UiException.Tests.Controls
                 "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.That(list.Items[0].BaseMethodName, Is.EqualTo("Fail to parse stack trace"));
             Assert.IsFalse(list.Items[0].HasSourceAttachment);
 
             return;
@@ -258,22 +255,18 @@ namespace NUnit.UiException.Tests.Controls
         {
             Size docSize = new Size(200, 500);
 
-            _mock.ExpectAndReturn("GetDocumentSize", docSize,
-                new object[] { _list.Items, _list.WorkingGraphics });
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
 
             _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();            
+
+            _mockRenderer.Received().DrawToGraphics(_list.Items, _list.SelectedItem, _list.WorkingGraphics, _list.ClientRectangle);
+            _mockRenderer.Received().DrawItem(_list.Items[0], 0, true, false, _list.WorkingGraphics, _list.ClientRectangle);
 
             return;
-        }        
+        }
 
         [Test]
         public void Click_Can_Select_Item()
@@ -282,19 +275,15 @@ namespace NUnit.UiException.Tests.Controls
             Point point;
             ErrorItem selection;
 
-            _mock.ExpectAndReturn("GetDocumentSize", docSize,
-                new object[] { _list.Items, _list.WorkingGraphics });
-
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
             _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 });
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[0]);
             _list.FireClick(point);
-            _mock.Verify();
+
             Assert.NotNull(_list.SelectedItem);
             Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
 
@@ -302,10 +291,9 @@ namespace NUnit.UiException.Tests.Controls
 
             selection = _list.SelectedItem;
             point = new Point(10, 110);
-            _mock.ExpectAndReturn("ItemAt", _list.Items[1],
-                new object[] { _list.Items, _list.WorkingGraphics, point });
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[1]);
             _list.FireClick(point);
-            _mock.Verify();
+
             Assert.NotNull(_list.SelectedItem);
             Assert.That(_list.SelectedItem, Is.SameAs(selection));
 
@@ -318,46 +306,37 @@ namespace NUnit.UiException.Tests.Controls
             Size docSize = new Size(200, 500);
             Point point;
 
-            _mock.ExpectAndReturn("GetDocumentSize", docSize,
-                new object[] { _list.Items, _list.WorkingGraphics });
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
 
             _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 });
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[0]);
             _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 });
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[1]);
             _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 });
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[3]);
             _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 });
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
             _list.StackTrace = null;
             Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
 
@@ -427,3 +406,4 @@ namespace NUnit.UiException.Tests.Controls
         }
     }
 }
+#endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestErrorPanelLayout.cs b/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
index e9f87a5..27253f7 100644
--- a/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
+++ b/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
@@ -3,9 +3,6 @@
 // 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;
diff --git a/src/GuiException/tests/Controls/TestErrorToolbar.cs b/src/GuiException/tests/Controls/TestErrorToolbar.cs
index 45495f8..0c81a3d 100644
--- a/src/GuiException/tests/Controls/TestErrorToolbar.cs
+++ b/src/GuiException/tests/Controls/TestErrorToolbar.cs
@@ -3,25 +3,22 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
+#if NET_3_5 || NET_4_0
 using System;
-using System.Collections.Generic;
-using System.Text;
+using NSubstitute;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
-using NUnit.Mocks;
 using System.Windows.Forms;
 using System.Drawing;
 
 namespace NUnit.UiException.Tests.Controls
 {
-    [TestFixture]
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
     public class TestErrorToolbar
     {
         private ErrorToolbar _emptyToolbar;
         private ErrorToolbar _filledToolbar;
 
-        private DynamicMock _rawMock;
-        private DynamicMock _browserMock;
         private IErrorDisplay _raw;
         private IErrorDisplay _browser;
 
@@ -33,13 +30,11 @@ namespace NUnit.UiException.Tests.Controls
             _emptyToolbar = new ErrorToolbar();
             _filledToolbar = new ErrorToolbar();
 
-            _rawMock = MockHelper.NewMockIErrorRenderer("raw", 1);
-            _rawMock.SetReturnValue("get_PluginItem", new ToolStripButton());
-            _raw = (IErrorDisplay)_rawMock.MockInstance;
+            _raw = Substitute.For<IErrorDisplay>();
+            _raw.PluginItem.Returns(new ToolStripButton());
             
-            _browserMock = MockHelper.NewMockIErrorRenderer("browser", 2);
-            _browserMock.SetReturnValue("get_PluginItem", new ToolStripButton());
-            _browser = (IErrorDisplay)_browserMock.MockInstance;
+            _browser = Substitute.For<IErrorDisplay>();
+            _browser.PluginItem.Returns(new ToolStripButton());
 
             _filledToolbar.Register(_raw);
             _filledToolbar.Register(_browser);
@@ -89,8 +84,8 @@ namespace NUnit.UiException.Tests.Controls
             }
 
             try {
-                _rawMock.SetReturnValue("get_PluginItem", null); 
-                _emptyToolbar.Register((IErrorDisplay)_rawMock.MockInstance); // throws exception
+                _raw.PluginItem.Returns((ToolStripButton) null); 
+                _emptyToolbar.Register(_raw); // throws exception
                 Assert.Fail();
             }
             catch (Exception e) {
@@ -106,13 +101,9 @@ namespace NUnit.UiException.Tests.Controls
              MatchType = MessageMatch.Contains)]
         public void Cannot_Select_UnRegistered_Display()
         {
-            DynamicMock unknown = new DynamicMock(typeof(IErrorDisplay));
+            IErrorDisplay unknown = Substitute.For<IErrorDisplay>();
 
-            _rawMock.SetReturnValue("Equals", false);
-            _browserMock.SetReturnValue("Equals", false);
-
-            _filledToolbar.SelectedDisplay = 
-                (IErrorDisplay)unknown.MockInstance; // throws exception
+            _filledToolbar.SelectedDisplay = unknown; // throws exception
 
             return;
         }
@@ -164,21 +155,14 @@ namespace NUnit.UiException.Tests.Controls
             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);
+            _raw.PluginItem.Returns(rawView);
+            _raw.OptionItems.Returns((ToolStripItem[]) 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);
+            _browser.PluginItem.Returns(browserView);
+            _browser.OptionItems.Returns(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]));
@@ -241,3 +225,4 @@ namespace NUnit.UiException.Tests.Controls
         }        
     }
 }
+#endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs b/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
index c71d2bd..75af05b 100644
--- a/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
+++ b/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
@@ -3,12 +3,10 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-using System;
-using System.Collections.Generic;
-using System.Text;
+#if NET_3_5 || NET_4_0
+using NSubstitute;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
-using NUnit.Mocks;
 using System.Windows.Forms;
 using NUnit.UiException.CodeFormatters;
 using NUnit.UiException.Tests.data;
@@ -16,28 +14,20 @@ using System.Drawing;
 
 namespace NUnit.UiException.Tests.Controls
 {
-    [TestFixture]
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
     public class TestSourceCodeDisplay
     {
         private TestingCode _code;
-        private DynamicMock _mockStack;
-        private DynamicMock _mockCode;
+        private IStackTraceView _mockStack;
+        private ICodeView _mockCode;
 
         [SetUp]
         public void SetUp()
         {
-            Panel fakeStackControl = new Panel();
-            Panel fakeCodeControl = new Panel();
+            _mockStack = Substitute.For<IStackTraceView>();
+            _mockCode = Substitute.For<ICodeView>();
 
-            _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);
+            _code = new TestingCode(_mockStack, _mockCode);
 
             return;
         }
@@ -108,22 +98,20 @@ namespace NUnit.UiException.Tests.Controls
             // handle selection changed event when there
             // is a non null selected item
 
-            using (new TestResource("Basic.cs"))
+            using (TestResource resource = new TestResource("Basic.cs"))
             {
-                item = new ErrorItem("Basic.cs", 2);
+                item = new ErrorItem(resource.Path, 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 });
+                _mockStack.SelectedItem.Returns(item);
+                _mockCode.Formatter.Returns(formatter);
                 
                 _code.RaiseSelectedItemChanged();
-                _mockStack.Verify();
-                _mockCode.Verify();
+
+                Assert.That(_mockCode.Text, Is.EqualTo(item.ReadFile()));
+                Assert.That(_mockCode.Language, Is.EqualTo("C#"));
+                // CurrentLine is a based 0 index
+                Assert.That(_mockCode.CurrentLine, Is.EqualTo(1));
             }
 
             // test to fail:
@@ -131,12 +119,11 @@ namespace NUnit.UiException.Tests.Controls
             // should handle selection changed event even
             // if selection comes to null
 
-            _mockStack.ExpectAndReturn("get_SelectedItem", null, null);
-            _mockCode.Expect("set_Text", new object[] { null });
+            _mockStack.SelectedItem.Returns((ErrorItem) null); 
 
             _code.RaiseSelectedItemChanged();
-            _mockStack.Verify();
-            _mockCode.Verify();
+
+            Assert.That(_mockCode.Text, Is.EqualTo(null));
 
             return;
         }
@@ -144,17 +131,14 @@ namespace NUnit.UiException.Tests.Controls
         [Test]
         public void ListOrderPolicy()
         {
-            _mockStack.Expect("set_ListOrderPolicy", ErrorListOrderPolicy.ReverseOrder);
             _code.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
-            _mockStack.Verify();
+            Assert.That(_mockStack.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
 
-            _mockStack.ExpectAndReturn("get_ListOrderPolicy", ErrorListOrderPolicy.ReverseOrder);
+            _mockStack.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
             Assert.That(_code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
-            _mockStack.Verify();
 
-            _mockStack.Expect("set_ListOrderPolicy", ErrorListOrderPolicy.InitialOrder);
+            _mockStack.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
             _code.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
-            _mockStack.Verify();
 
             return;
         }
@@ -198,3 +182,4 @@ namespace NUnit.UiException.Tests.Controls
         }
     }
 }
+#endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestSplitterBox.cs b/src/GuiException/tests/Controls/TestSplitterBox.cs
index 1df7826..e561e58 100644
--- a/src/GuiException/tests/Controls/TestSplitterBox.cs
+++ b/src/GuiException/tests/Controls/TestSplitterBox.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
 using System.Windows.Forms;
diff --git a/src/GuiException/tests/Controls/TestStackTraceDisplay.cs b/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
index 5bb0ac2..82e1d19 100644
--- a/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
+++ b/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
 using NUnit.UiException.Controls;
 using System.Windows.Forms;
diff --git a/src/GuiException/tests/MockHelper.cs b/src/GuiException/tests/MockHelper.cs
deleted file mode 100644
index 3a12f47..0000000
--- a/src/GuiException/tests/MockHelper.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// ****************************************************************
-// 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
index bd88a0f..051be6a 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
@@ -3,9 +3,6 @@
 // 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;
@@ -43,7 +40,7 @@ namespace NUnit.UiException.Tests.StackTraceAnalyzers
             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
+            // check it doesn't rely upon filePath or line information
             //res = AcceptValue(_parser, "get_Text()");
             //Assert.That(res.Function, Is.EqualTo("get_Text()"));
 
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
index fc7b4fc..8a60802 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
@@ -4,8 +4,6 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.UiException.StackTraceAnalyzers;
 using NUnit.Framework;
 using NUnit.UiException.StackTraceAnalysers;
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
index ef18eb4..96323b1 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
@@ -3,9 +3,6 @@
 // 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;
@@ -41,7 +38,7 @@ namespace NUnit.UiException.Tests.StackTraceAnalyzers
             Assert.That(res.Line, Is.EqualTo(42));
 
             // parser doesn't rely on the existence of
-            // a method name or path value
+            // a method name or filePath value
             res = AcceptValue(_parser, ":43");
             Assert.That(res.Line, Is.EqualTo(43));
 
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
index b84bde1..894dfca 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
@@ -3,9 +3,6 @@
 // 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;
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
index c9e7964..898ffae 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
@@ -3,9 +3,6 @@
 // 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;
@@ -41,7 +38,7 @@ namespace NUnit.UiException.Tests.StackTraceAnalyzers
             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
+            // check it supports white space in filePath
             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"));
 
@@ -80,15 +77,15 @@ namespace NUnit.UiException.Tests.StackTraceAnalyzers
         [Test]
         public void Test_Inability_To_Parse_Non_Unix_Like_Path_Values()
         {
-            // check it fails to parse Windows like path values
+            // check it fails to parse Windows like filePath values
             RejectValue(_parser, "à get_Text() dans C:\\Users\\ihottier\\Work\\file1:line1");
 
-            // check it fails to parse ill-formed Unix path values
+            // check it fails to parse ill-formed Unix filePath 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
+            // check it fails to parse missing filePath value
             RejectValue(_parser, "à get_Text()");
 
             return;
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
index 7b70207..9d22643 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
@@ -3,9 +3,6 @@
 // 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;
@@ -41,7 +38,7 @@ namespace NUnit.UiException.Tests.StackTraceAnalyzers
             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
+            // check it supports white space in filePath
             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"));
 
@@ -81,15 +78,15 @@ namespace NUnit.UiException.Tests.StackTraceAnalyzers
         [Test]
         public void Test_Inability_To_Parse_Non_Windows_Like_Path_Values()
         {
-            // check it fails to parse Unix like path values
+            // check it fails to parse Unix like filePath values
             RejectValue(_parser, "à get_Text() dans /home/ihottier/work/file1:line1");
 
-            // check it fails to parse ill-formed windows path values
+            // check it fails to parse ill-formed windows filePath 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
+            // check it fails to parse missing filePath value
             RejectValue(_parser, "à get_Text()");
 
             return;
diff --git a/src/GuiException/tests/TestDefaultTextManager.cs b/src/GuiException/tests/TestDefaultTextManager.cs
index 92cb81a..1e11be0 100644
--- a/src/GuiException/tests/TestDefaultTextManager.cs
+++ b/src/GuiException/tests/TestDefaultTextManager.cs
@@ -3,11 +3,8 @@
 // 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
 {
diff --git a/src/GuiException/tests/TestExceptionItem.cs b/src/GuiException/tests/TestExceptionItem.cs
index aaab7a5..615f85b 100644
--- a/src/GuiException/tests/TestExceptionItem.cs
+++ b/src/GuiException/tests/TestExceptionItem.cs
@@ -4,10 +4,7 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
-using NUnit.UiException;
 using NUnit.UiException.Tests.data;
 using System.IO;
 
@@ -152,9 +149,9 @@ namespace NUnit.UiException.Tests
         {
             ErrorItem item;
 
-            using (new TestResource("HelloWorld.txt"))
+            using (TestResource resource = new TestResource("HelloWorld.txt"))
             {
-                item = new ErrorItem("HelloWorld.txt", 1);
+                item = new ErrorItem(resource.Path, 1);
 
                 Assert.That(item.ReadFile(), Is.Not.Null);
                 Assert.That(item.ReadFile(), Is.EqualTo("Hello world!"));
diff --git a/src/GuiException/tests/TestExceptionItemCollection.cs b/src/GuiException/tests/TestExceptionItemCollection.cs
index 4c09d21..c6557a2 100644
--- a/src/GuiException/tests/TestExceptionItemCollection.cs
+++ b/src/GuiException/tests/TestExceptionItemCollection.cs
@@ -5,8 +5,6 @@
 
 using System;
 using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException;
 using NUnit.Framework;
 using NUnit.UiException.Tests.data;
 
diff --git a/src/GuiException/tests/TestPaintLineLocation.cs b/src/GuiException/tests/TestPaintLineLocation.cs
index ea50d07..8daa6d0 100644
--- a/src/GuiException/tests/TestPaintLineLocation.cs
+++ b/src/GuiException/tests/TestPaintLineLocation.cs
@@ -4,10 +4,7 @@
 // ****************************************************************
 
 using System;
-using System.Collections.Generic;
-using System.Text;
 using NUnit.Framework;
-using NUnit.UiException;
 using System.Drawing;
 using NUnit.UiException.Controls;
 
diff --git a/src/GuiException/tests/TestStackTraceParser.cs b/src/GuiException/tests/TestStackTraceParser.cs
index b36dfa7..9784e3d 100644
--- a/src/GuiException/tests/TestStackTraceParser.cs
+++ b/src/GuiException/tests/TestStackTraceParser.cs
@@ -3,11 +3,7 @@
 // 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
 {
@@ -199,7 +195,7 @@ namespace NUnit.UiException.Tests
             // NUnit.UiException.Tests ability to not depend of one file system
             //
 
-            // here, an hypothetic stack containing UNIX and Windows like path values...
+            // here, an hypothetic stack containing UNIX and Windows like filePath values...
            
             _parser.Parse(
                 "at Test.TestStackTraceParser.Test_Parse() in /home/ihottier/work/stacktrace/test/TestStackTraceParser.cs:line 36\r\n" +
diff --git a/src/GuiException/tests/nunit.uiexception.tests.build b/src/GuiException/tests/nunit.uiexception.tests.build
index 557bc51..d0791cd 100644
--- a/src/GuiException/tests/nunit.uiexception.tests.build
+++ b/src/GuiException/tests/nunit.uiexception.tests.build
@@ -62,6 +62,7 @@
         <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.lib.dir}/NSubstitute.dll" if="${runtime.version >= '3.5'}"/>
         <include name="${current.test.dir}/test-utilities.dll"/>
       </references>
     </csc>
diff --git a/src/GuiException/tests/nunit.uiexception.tests.csproj b/src/GuiException/tests/nunit.uiexception.tests.csproj
index 0997e40..2704a5f 100644
--- a/src/GuiException/tests/nunit.uiexception.tests.csproj
+++ b/src/GuiException/tests/nunit.uiexception.tests.csproj
@@ -1,23 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</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>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <TargetFrameworkVersion>v3.5</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>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
@@ -25,27 +30,28 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
     <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
+    <Reference Include="NSubstitute">
+      <HintPath>..\..\..\lib\3.5\NSubstitute.dll</HintPath>
+    </Reference>
   </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>
@@ -81,7 +87,6 @@
     <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" />
diff --git a/src/GuiRunner/nunit-gui-exe/App.config b/src/GuiRunner/nunit-gui-exe/App.config
index 6c0320e..7bd69c5 100644
--- a/src/GuiRunner/nunit-gui-exe/App.config
+++ b/src/GuiRunner/nunit-gui-exe/App.config
@@ -1,83 +1,30 @@
 <?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>
-
+   The GUI only runs under .NET 2.0 or higher. The
+   useLegacyV2RuntimeActivationPolicy setting only
+   applies under .NET 4.0 and permits use of mixed 
+   mode assemblies, which would otherwise not load 
+   correctly.
+  -->
+  <startup useLegacyV2RuntimeActivationPolicy="true">
+    <!-- Comment out the next line to force use of .NET 4.0 -->
+    <supportedRuntime version="v2.0.50727" />
+    <supportedRuntime version="v4.0.30319" />
+  </startup>
+  
   <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
+    <!-- Ensure that test exceptions don't crash NUnit -->
     <legacyUnhandledExceptionPolicy enabled="1" />
 
+    <!-- Run partial trust V2 assemblies in full trust under .NET 4.0 -->
+    <loadFromRemoteSources enabled="true" />
+    
     <!-- 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/Ship.config b/src/GuiRunner/nunit-gui-exe/Ship.config
deleted file mode 100644
index 6c0320e..0000000
--- a/src/GuiRunner/nunit-gui-exe/Ship.config
+++ /dev/null
@@ -1,83 +0,0 @@
-<?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 26bb3fd..f56a298 100644
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
+++ b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
@@ -21,14 +21,14 @@
       </references>
     </csc>
 
-    <copy file="Ship.config"
+    <copy file="App.config"
       tofile="${current.build.dir}/nunit.exe.config"/>
 
     <csc target="winexe" 
         output="${current.build.dir}/nunit-x86.exe" 
         win32icon="App.ico" debug="${build.debug}"
         define="${build.defines}" platform="x86" 
-        if="${build.x86}">
+        if="${runtime.version >= '2.0'}">
       <sources>
         <patternset refid="source-files"/>
         <include name="../../GeneratedAssemblyInfo.cs"/>
@@ -39,7 +39,7 @@
       </references>
     </csc>
 
-    <copy file="Ship.config" if="${build.x86}"
+    <copy file="App.config" if="${runtime.version >='2.0'}"
       tofile="${current.build.dir}/nunit-x86.exe.config"/>
   </target>
 
@@ -51,7 +51,6 @@
         <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 71b5f46..d715a27 100644
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
+++ b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -47,7 +47,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -64,7 +64,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
diff --git a/src/GuiRunner/nunit-gui/AboutBox.cs b/src/GuiRunner/nunit-gui/AboutBox.cs
index 88fe159..b8c42bd 100644
--- a/src/GuiRunner/nunit-gui/AboutBox.cs
+++ b/src/GuiRunner/nunit-gui/AboutBox.cs
@@ -58,15 +58,14 @@ namespace NUnit.Gui
 				    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.";
+			string copyrightText = "Copyright (C) 2002-2012 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);
 			if ( objectAttrs.Length > 0 )
 				copyrightText = ((AssemblyCopyrightAttribute)objectAttrs[0]).Copyright;
 
 			versionLabel.Text = versionText;
 			copyright.Text = copyrightText;
-			dotNetVersionLabel.Text = string.Format( "{0} ( {1} )", Environment.Version, 
-				NUnit.Core.RuntimeFramework.CurrentFramework.DisplayName );
+			dotNetVersionLabel.Text = NUnit.Core.RuntimeFramework.CurrentFramework.DisplayName;
 		}
 
 		/// <summary>
@@ -91,159 +90,159 @@ namespace NUnit.Gui
 		/// </summary>
 		private void InitializeComponent()
 		{
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AboutBox));
-			this.OkButton = new System.Windows.Forms.Button();
-			this.label1 = new System.Windows.Forms.Label();
-			this.versionLabel = new System.Windows.Forms.Label();
-			this.label2 = new System.Windows.Forms.Label();
-			this.label3 = new System.Windows.Forms.Label();
-			this.linkLabel1 = new System.Windows.Forms.LinkLabel();
-			this.label4 = new System.Windows.Forms.Label();
-			this.label5 = new System.Windows.Forms.Label();
-			this.label6 = new System.Windows.Forms.Label();
-			this.label7 = new System.Windows.Forms.Label();
-			this.copyright = new System.Windows.Forms.Label();
-			this.clrTypeLabel = new System.Windows.Forms.Label();
-			this.dotNetVersionLabel = new System.Windows.Forms.Label();
-			this.SuspendLayout();
-			// 
-			// OkButton
-			// 
-			this.OkButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.OkButton.Location = new System.Drawing.Point(368, 304);
-			this.OkButton.Name = "OkButton";
-			this.OkButton.Size = new System.Drawing.Size(96, 29);
-			this.OkButton.TabIndex = 0;
-			this.OkButton.Text = "OK";
-			this.OkButton.Click += new System.EventHandler(this.button1_Click);
-			// 
-			// label1
-			// 
-			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;
-			this.label1.Text = "Version:";
-			// 
-			// versionLabel
-			// 
-			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;
-			this.versionLabel.Text = "label2";
-			// 
-			// label2
-			// 
-			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;
-			this.label2.Text = "Developers:";
-			// 
-			// label3
-			// 
-			this.label3.Location = new System.Drawing.Point(164, 144);
-			this.label3.Name = "label3";
-			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";
-			// 
-			// linkLabel1
-			// 
-			this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(0, 21);
-			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;
-			this.linkLabel1.TabStop = true;
-			this.linkLabel1.Text = "http://www.nunit.org ";
-			this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
-			// 
-			// label4
-			// 
-			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;
-			this.label4.Text = "Information:";
-			// 
-			// label5
-			// 
-			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;
-			this.label5.Text = "Thanks to:";
-			// 
-			// label6
-			// 
-			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;
-			this.label6.Text = "Kent Beck and Erich Gamma";
-			// 
-			// label7
-			// 
-			this.label7.Location = new System.Drawing.Point(31, 20);
-			this.label7.Name = "label7";
-			this.label7.Size = new System.Drawing.Size(102, 28);
-			this.label7.TabIndex = 9;
-			this.label7.Text = "Copyright:";
-			// 
-			// copyright
-			// 
-			this.copyright.Location = new System.Drawing.Point(164, 20);
-			this.copyright.Name = "copyright";
-			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, 272);
-			this.clrTypeLabel.Name = "clrTypeLabel";
-			this.clrTypeLabel.Size = new System.Drawing.Size(102, 15);
-			this.clrTypeLabel.TabIndex = 11;
-			this.clrTypeLabel.Text = "CLR Version:";
-			// 
-			// dotNetVersionLabel
-			// 
-			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;
-			this.dotNetVersionLabel.Text = "label9";
-			// 
-			// AboutBox
-			// 
-			this.AcceptButton = this.OkButton;
-			this.CancelButton = this.OkButton;
-			this.ClientSize = new System.Drawing.Size(490, 346);
-			this.Controls.Add(this.dotNetVersionLabel);
-			this.Controls.Add(this.clrTypeLabel);
-			this.Controls.Add(this.copyright);
-			this.Controls.Add(this.label7);
-			this.Controls.Add(this.label6);
-			this.Controls.Add(this.label5);
-			this.Controls.Add(this.label4);
-			this.Controls.Add(this.linkLabel1);
-			this.Controls.Add(this.label3);
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.versionLabel);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.OkButton);
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
-			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.Name = "AboutBox";
-			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "About NUnit";
-			this.ResumeLayout(false);
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox));
+            this.OkButton = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.versionLabel = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.copyright = new System.Windows.Forms.Label();
+            this.clrTypeLabel = new System.Windows.Forms.Label();
+            this.dotNetVersionLabel = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // OkButton
+            // 
+            this.OkButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.OkButton.Location = new System.Drawing.Point(368, 304);
+            this.OkButton.Name = "OkButton";
+            this.OkButton.Size = new System.Drawing.Size(96, 29);
+            this.OkButton.TabIndex = 0;
+            this.OkButton.Text = "OK";
+            this.OkButton.Click += new System.EventHandler(this.button1_Click);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(31, 240);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(102, 23);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "NUnit Version:";
+            // 
+            // versionLabel
+            // 
+            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;
+            this.versionLabel.Text = "label2";
+            // 
+            // label2
+            // 
+            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;
+            this.label2.Text = "Developers:";
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(164, 144);
+            this.label3.Name = "label3";
+            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";
+            // 
+            // linkLabel1
+            // 
+            this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(0, 21);
+            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;
+            this.linkLabel1.TabStop = true;
+            this.linkLabel1.Text = "http://www.nunit.org ";
+            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
+            // 
+            // label4
+            // 
+            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;
+            this.label4.Text = "Information:";
+            // 
+            // label5
+            // 
+            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;
+            this.label5.Text = "Thanks to:";
+            // 
+            // label6
+            // 
+            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;
+            this.label6.Text = "Kent Beck and Erich Gamma";
+            // 
+            // label7
+            // 
+            this.label7.Location = new System.Drawing.Point(31, 20);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(102, 28);
+            this.label7.TabIndex = 9;
+            this.label7.Text = "Copyright:";
+            // 
+            // copyright
+            // 
+            this.copyright.Location = new System.Drawing.Point(164, 20);
+            this.copyright.Name = "copyright";
+            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, 272);
+            this.clrTypeLabel.Name = "clrTypeLabel";
+            this.clrTypeLabel.Size = new System.Drawing.Size(127, 23);
+            this.clrTypeLabel.TabIndex = 11;
+            this.clrTypeLabel.Text = "Framework Version:";
+            // 
+            // dotNetVersionLabel
+            // 
+            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;
+            this.dotNetVersionLabel.Text = "label9";
+            // 
+            // AboutBox
+            // 
+            this.AcceptButton = this.OkButton;
+            this.CancelButton = this.OkButton;
+            this.ClientSize = new System.Drawing.Size(490, 346);
+            this.Controls.Add(this.dotNetVersionLabel);
+            this.Controls.Add(this.clrTypeLabel);
+            this.Controls.Add(this.copyright);
+            this.Controls.Add(this.label7);
+            this.Controls.Add(this.label6);
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.linkLabel1);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.versionLabel);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.OkButton);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "AboutBox";
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "About NUnit";
+            this.ResumeLayout(false);
 
 		}
 		#endregion
@@ -257,6 +256,6 @@ namespace NUnit.Gui
 		{
 			System.Diagnostics.Process.Start("http://nunit.org");
 			linkLabel1.LinkVisited = true;
-		}
+        }
 	}
 }
diff --git a/src/GuiRunner/nunit-gui/AboutBox.resx b/src/GuiRunner/nunit-gui/AboutBox.resx
index 0ad18e6..45ab8da 100644
--- a/src/GuiRunner/nunit-gui/AboutBox.resx
+++ b/src/GuiRunner/nunit-gui/AboutBox.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,162 +109,16 @@
     <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="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">
+  <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/AppEntry.cs b/src/GuiRunner/nunit-gui/AppEntry.cs
index 67dd216..ad997b6 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.
+// 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;
@@ -46,11 +46,17 @@ namespace NUnit.Gui
                 attachedConsole = new GuiAttachedConsole();
             }
 
-            if (!guiOptions.Validate() || guiOptions.help)
+            if (guiOptions.help)
             {
-                string message = guiOptions.GetHelpText();
-                UserMessage.DisplayFailure(message, "Help Syntax");
-                log.Error("Command line error: " + message);
+                MessageDisplay.Display(guiOptions.GetHelpText());
+                return 0;
+            }
+
+            if (!guiOptions.Validate())
+            {
+                string message = "Error in command line";
+                MessageDisplay.Error(message + Environment.NewLine + Environment.NewLine + guiOptions.GetHelpText());
+                log.Error(message);
                 return 2;
             }
 
@@ -90,8 +96,8 @@ namespace NUnit.Gui
             }
             catch (Exception ex)
             {
-                UserMessage.DisplayFatalError(ex, null, "Unable to Initialize Services");
-                log.Error("Unable to initialize services", ex);
+                MessageDisplay.FatalError("Service initialization failed.", ex);
+                log.Error("Service initialization failed", ex);
                 return 2;
             }
 
@@ -135,5 +141,10 @@ namespace NUnit.Gui
 
             return 0;
         }
+
+        private static IMessageDisplay MessageDisplay
+        {
+            get { return new MessageDisplay("NUnit"); }
+        }
     }
 }
diff --git a/src/GuiRunner/nunit-gui/GuiOptions.cs b/src/GuiRunner/nunit-gui/GuiOptions.cs
index 4318f6a..0289c32 100644
--- a/src/GuiRunner/nunit-gui/GuiOptions.cs
+++ b/src/GuiRunner/nunit-gui/GuiOptions.cs
@@ -75,7 +75,7 @@ namespace NUnit.Gui
 		public override string GetHelpText()
 		{
 			return
-				"NUNIT-GUI [inputfile] [options]\r\r" +
+				"NUNIT [inputfile] [options]\r\r" +
 				"Runs a set of NUnit tests from the console. You may specify\r" +
 				"an assembly or a project file of type .nunit as input.\r\r" +
 				"Options:\r" +
diff --git a/src/GuiRunner/nunit-gui/NUnitForm.cs b/src/GuiRunner/nunit-gui/NUnitForm.cs
index bc526bf..eef5339 100644
--- a/src/GuiRunner/nunit-gui/NUnitForm.cs
+++ b/src/GuiRunner/nunit-gui/NUnitForm.cs
@@ -23,9 +23,11 @@ namespace NUnit.Gui
 	using NUnit.UiKit;
 	using CP.Windows.Forms;
 
-	public class NUnitForm : System.Windows.Forms.Form
+	public class NUnitForm : NUnitFormBase
 	{
-		#region Instance variables
+        static Logger log = InternalTrace.GetLogger(typeof(NUnitForm));
+        
+        #region Instance variables
 
 		// Handlers for our recentFiles and recentProjects
 		private RecentFileMenuHandler recentProjectsMenuHandler;
@@ -42,6 +44,9 @@ namespace NUnit.Gui
 		// Our current run command line options
 		private GuiOptions guiOptions;
 
+        // Our 'presenter' - under development
+        private NUnitPresenter presenter;
+
 		private System.ComponentModel.IContainer components;
 
 		private System.Windows.Forms.Panel leftPanel;
@@ -52,10 +57,9 @@ namespace NUnit.Gui
 
 		public System.Windows.Forms.GroupBox groupBox1;
 		public System.Windows.Forms.Button runButton;
-		private System.Windows.Forms.Button stopButton;
-		public System.Windows.Forms.Label suiteName;
+        private System.Windows.Forms.Button stopButton;
 		public NUnit.UiKit.TestProgressBar progressBar;
-		private System.Windows.Forms.Label runCount;
+		private CP.Windows.Forms.ExpandingLabel runCount;
 
 		public NUnit.UiKit.ResultTabs resultTabs;
 
@@ -126,19 +130,23 @@ namespace NUnit.Gui
 		private System.Windows.Forms.MenuItem toolsMenuSeparator1;
 		private System.Windows.Forms.MenuItem assemblyDetailsMenuItem;
         private MenuItem runtimeMenuItem;
+        private MenuItem openLogDirectoryMenuItem;
+        private ExpandingLabel suiteName;
 		private System.Windows.Forms.MenuItem addAssemblyMenuItem;
 
 		#endregion
 		
 		#region Construction and Disposal
 
-		public NUnitForm( GuiOptions guiOptions )
+		public NUnitForm( GuiOptions guiOptions ) : base("NUnit")
 		{
 			InitializeComponent();
 
 			this.guiOptions = guiOptions;
 			this.recentFilesService = Services.RecentFiles;
 			this.userSettings = Services.UserSettings;
+
+            this.presenter = new NUnitPresenter(this, TestLoader);
 		}
 
 		protected override void Dispose( bool disposing )
@@ -216,6 +224,7 @@ namespace NUnit.Gui
             this.assemblyDetailsMenuItem = new System.Windows.Forms.MenuItem();
             this.saveXmlResultsMenuItem = new System.Windows.Forms.MenuItem();
             this.exceptionDetailsMenuItem = new System.Windows.Forms.MenuItem();
+            this.openLogDirectoryMenuItem = 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();
@@ -227,10 +236,10 @@ namespace NUnit.Gui
             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.suiteName = new CP.Windows.Forms.ExpandingLabel();
+            this.runCount = new CP.Windows.Forms.ExpandingLabel();
             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);
@@ -546,7 +555,7 @@ namespace NUnit.Gui
             this.runFailedMenuItem,
             this.testMenuSeparator,
             this.stopRunMenuItem});
-            this.testMenu.Text = "&Test";
+            this.testMenu.Text = "&Tests";
             // 
             // runAllMenuItem
             // 
@@ -588,6 +597,7 @@ namespace NUnit.Gui
             this.assemblyDetailsMenuItem,
             this.saveXmlResultsMenuItem,
             this.exceptionDetailsMenuItem,
+            this.openLogDirectoryMenuItem,
             this.toolsMenuSeparator1,
             this.settingsMenuItem,
             this.toolsMenuSeparator2,
@@ -613,25 +623,31 @@ namespace NUnit.Gui
             this.exceptionDetailsMenuItem.Text = "&Exception Details...";
             this.exceptionDetailsMenuItem.Click += new System.EventHandler(this.exceptionDetailsMenuItem_Click);
             // 
+            // openLogDirectoryMenuItem
+            // 
+            this.openLogDirectoryMenuItem.Index = 3;
+            this.openLogDirectoryMenuItem.Text = "Open &Log Directory...";
+            this.openLogDirectoryMenuItem.Click += new System.EventHandler(this.openLogDirectoryMenuItem_Click);
+            // 
             // toolsMenuSeparator1
             // 
-            this.toolsMenuSeparator1.Index = 3;
+            this.toolsMenuSeparator1.Index = 4;
             this.toolsMenuSeparator1.Text = "-";
             // 
             // settingsMenuItem
             // 
-            this.settingsMenuItem.Index = 4;
+            this.settingsMenuItem.Index = 5;
             this.settingsMenuItem.Text = "&Settings...";
             this.settingsMenuItem.Click += new System.EventHandler(this.settingsMenuItem_Click);
             // 
             // toolsMenuSeparator2
             // 
-            this.toolsMenuSeparator2.Index = 5;
+            this.toolsMenuSeparator2.Index = 6;
             this.toolsMenuSeparator2.Text = "-";
             // 
             // addinInfoMenuItem
             // 
-            this.addinInfoMenuItem.Index = 6;
+            this.addinInfoMenuItem.Index = 7;
             this.addinInfoMenuItem.Text = "Addins...";
             this.addinInfoMenuItem.Click += new System.EventHandler(this.addinInfoMenuItem_Click);
             // 
@@ -684,10 +700,10 @@ namespace NUnit.Gui
             // 
             // groupBox1
             // 
+            this.groupBox1.Controls.Add(this.suiteName);
             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);
@@ -696,43 +712,45 @@ namespace NUnit.Gui
             this.groupBox1.TabIndex = 0;
             this.groupBox1.TabStop = false;
             // 
+            // 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.AutoEllipsis = true;
+            this.suiteName.Location = new System.Drawing.Point(145, 21);
+            this.suiteName.Name = "suiteName";
+            this.suiteName.Size = new System.Drawing.Size(343, 23);
+            this.suiteName.TabIndex = 1;
+            // 
             // 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.AutoEllipsis = true;
+            this.runCount.Location = new System.Drawing.Point(8, 89);
             this.runCount.Name = "runCount";
-            this.runCount.Size = new System.Drawing.Size(480, 16);
+            this.runCount.Size = new System.Drawing.Size(480, 21);
             this.runCount.TabIndex = 5;
-            this.runCount.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
             // 
             // stopButton
             // 
-            this.stopButton.Location = new System.Drawing.Point(96, 18);
+            this.stopButton.AutoSize = true;
+            this.stopButton.Location = new System.Drawing.Point(75, 16);
             this.stopButton.Name = "stopButton";
-            this.stopButton.Size = new System.Drawing.Size(96, 38);
+            this.stopButton.Size = new System.Drawing.Size(64, 31);
             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.Location = new System.Drawing.Point(8, 16);
             this.runButton.Name = "runButton";
-            this.runButton.Size = new System.Drawing.Size(88, 38);
+            this.runButton.Size = new System.Drawing.Size(64, 31);
             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)
@@ -741,7 +759,7 @@ namespace NUnit.Gui
             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.Location = new System.Drawing.Point(8, 54);
             this.progressBar.Maximum = 100;
             this.progressBar.Minimum = 0;
             this.progressBar.Name = "progressBar";
@@ -797,6 +815,7 @@ namespace NUnit.Gui
             this.Closing += new System.ComponentModel.CancelEventHandler(this.NUnitForm_Closing);
             this.rightPanel.ResumeLayout(false);
             this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
             this.leftPanel.ResumeLayout(false);
             this.ResumeLayout(false);
 
@@ -804,9 +823,18 @@ namespace NUnit.Gui
 
 		#endregion
 
-		#region Properties used internally
+        #region Public Properties
+
+        public NUnitPresenter Presenter
+        {
+            get { return presenter; }
+        }
+
+        #endregion
 
-		private TestLoader _testLoader;
+        #region Properties used internally
+
+        private TestLoader _testLoader;
 		private TestLoader TestLoader
 		{
 			get
@@ -869,10 +897,17 @@ namespace NUnit.Gui
                 foreach (RuntimeFramework framework in frameworks)
                 {
                     MenuItem item = new MenuItem(framework.DisplayName);
-                    item.Checked = current.Matches(framework);
+                    item.Checked = current.Supports(framework);
                     item.Tag = framework;
                     item.Click += new EventHandler(runtimeFrameworkMenuItem_Click);
-                    item.Enabled = NUnitConfiguration.GetNUnitBinDirectory(framework.ClrVersion) != null;
+                    try
+                    {
+                        item.Enabled = TestLoader.CanReloadUnderRuntimeVersion(framework.ClrVersion);
+                    }
+                    catch
+                    {
+                        item.Enabled = false;
+                    }
                     runtimeMenuItem.MenuItems.Add(item);
                 }
             }
@@ -887,30 +922,27 @@ namespace NUnit.Gui
 
 		private void newMenuItem_Click(object sender, System.EventArgs e)
 		{
-			if ( IsProjectLoaded )
-				TestLoaderUI.CloseProject( this );
-
-			TestLoaderUI.NewProject( this );
+            presenter.NewProject();
 		}
 
 		private void openMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.OpenProject( this );
+            presenter.OpenProject();
 		}
 
 		private void closeMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.CloseProject( this );
+            presenter.CloseProject();
 		}
 
 		private void saveMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.SaveProject( this );
+            presenter.SaveProject();
 		}
 
 		private void saveAsMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.SaveProjectAs( this );
+            presenter.SaveProjectAs();
             SetTitleBar(TestProject.Name);
 		}
 
@@ -921,17 +953,7 @@ namespace NUnit.Gui
 
 		private void reloadProjectMenuItem_Click(object sender, System.EventArgs e)
 		{
-            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, projectPath, activeConfigName, null );
+            presenter.ReloadProject();
 		}
 
 		private void reloadTestsMenuItem_Click(object sender, System.EventArgs e)
@@ -1181,25 +1203,19 @@ namespace NUnit.Gui
 
 		private void addAssemblyMenuItem_Click(object sender, System.EventArgs e)
 		{
-            TestLoaderUI.AddAssembly(this);
+            presenter.AddAssembly();
             LoadOrReloadTestAsNeeded();
 		}
 
 		private void addVSProjectMenuItem_Click(object sender, System.EventArgs e)
 		{
-            TestLoaderUI.AddVSProject(this);
+            presenter.AddVSProject();
             LoadOrReloadTestAsNeeded();
 		}
 
 		private void editProjectMenuItem_Click(object sender, System.EventArgs e)
 		{
-			using ( ProjectEditor editor = new ProjectEditor( TestProject ) )
-			{
-				this.Site.Container.Add( editor );
-				editor.ShowDialog( this );
-			}
-
-            LoadOrReloadTestAsNeeded();
+            presenter.EditProject();
         }
 
         private void LoadOrReloadTestAsNeeded()
@@ -1256,7 +1272,7 @@ namespace NUnit.Gui
 
 		private void saveXmlResultsMenuItem_Click(object sender, System.EventArgs e)
 		{
-			TestLoaderUI.SaveLastResult( this );
+            presenter.SaveLastResult();
 		}
 
 		private void exceptionDetailsMenuItem_Click(object sender, System.EventArgs e)
@@ -1284,6 +1300,14 @@ namespace NUnit.Gui
 			dlg.ShowDialog();
 		}
 
+        private void openLogDirectoryMenuItem_Click(object sender, EventArgs e)
+        {
+            if (!Directory.Exists(NUnitConfiguration.LogDirectory))
+                Directory.CreateDirectory(NUnitConfiguration.LogDirectory);
+
+            System.Diagnostics.Process.Start(NUnitConfiguration.LogDirectory);
+        }
+
 		#endregion
 
 		#region Help Menu
@@ -1337,17 +1361,21 @@ namespace NUnit.Gui
 				this.Invalidate();
 				this.Update();
 
+                // Set Capture options for the TestLoader
+                TestLoader.IsTracingEnabled = resultTabs.IsTracingEnabled;
+                TestLoader.LoggingThreshold = resultTabs.MaximumLogLevel;
+
 				// Load test specified on command line or
 				// the most recent one if options call for it
 				if ( guiOptions.ParameterCount != 0 )
-					TestLoaderUI.OpenProject( this, (string)guiOptions.Parameters[0], guiOptions.config, guiOptions.fixture );
+                    presenter.OpenProject((string)guiOptions.Parameters[0], guiOptions.config, guiOptions.fixture);
 				else if( userSettings.GetSetting( "Options.LoadLastProject", true ) && !guiOptions.noload )
 				{
 					foreach( RecentFileEntry entry in recentFilesService.Entries )
 					{
 						if ( entry != null && entry.Exists && entry.IsCompatibleCLRVersion )
 						{
-							TestLoaderUI.OpenProject( this, entry.Path, guiOptions.config, guiOptions.fixture );
+                            presenter.OpenProject(entry.Path, guiOptions.config, guiOptions.fixture);
 							break;
 						}
 					}
@@ -1378,10 +1406,10 @@ namespace NUnit.Gui
 						try
 						{
 							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", false);
-							if ( guiOptions.runselected )
-								testTree.RunSelectedTests();
-							else
-								TestLoader.RunTests();
+                            if (guiOptions.runselected)
+                                testTree.RunSelectedTests();
+                            else
+                                testTree.RunAllTests(false);
 						}
 						finally
 						{
@@ -1541,7 +1569,7 @@ namespace NUnit.Gui
 		{
 			if ( IsTestRunning )
 			{
-				DialogResult dialogResult = UserMessage.Ask( 
+                DialogResult dialogResult = MessageDisplay.Ask( 
 					"A test is running, do you want to stop the test and exit?" );
 
 				if ( dialogResult == DialogResult.No )
@@ -1550,8 +1578,8 @@ namespace NUnit.Gui
 					TestLoader.CancelTestRun();
 			}
 
-			if ( !e.Cancel && IsProjectLoaded && 
-				TestLoaderUI.CloseProject( this ) == DialogResult.Cancel )
+			if ( !e.Cancel && IsProjectLoaded &&
+                presenter.CloseProject() == DialogResult.Cancel)
 				e.Cancel = true;
 		}
 
@@ -1566,6 +1594,11 @@ namespace NUnit.Gui
 					else
 						displayMiniGui();
 			}
+            else if (args.SettingName.StartsWith("Gui.TextOutput.") && args.SettingName.EndsWith(".Content"))
+            {
+                TestLoader.IsTracingEnabled = resultTabs.IsTracingEnabled;
+                TestLoader.LoggingThreshold = resultTabs.MaximumLogLevel;
+            }
 		}
 		#endregion
 
@@ -1593,7 +1626,7 @@ namespace NUnit.Gui
 
 			if ( IsTestRunning )
 			{
-				DialogResult dialogResult = UserMessage.Ask( 
+                DialogResult dialogResult = MessageDisplay.Ask( 
 					"Do you want to cancel the running test?" );
 
 				if ( dialogResult == DialogResult.No )
@@ -1614,19 +1647,28 @@ namespace NUnit.Gui
 
 		#endregion
 
-		#region Event Handlers for Test Load and Unload
+		#region Event Handlers for Project Load and Unload
 
 		private void OnTestProjectLoaded( object sender, TestEventArgs e )
 		{
-			SetTitleBar( e.Name );
+            string projectPath = e.Name;
+
+			SetTitleBar( projectPath );
 			projectMenu.Visible = true;
 			runCount.Text = "";
+
+            // If this is an NUnit project, set up watcher
+            if (NUnitProject.IsNUnitProjectFile(projectPath) && File.Exists(projectPath))
+                presenter.WatchProject(projectPath);
 		}
 
-		private void OnTestProjectUnloading( object sender, TestEventArgs e )
+        private void OnTestProjectUnloading(object sender, TestEventArgs e)
 		{
-			if ( e.Name != null && File.Exists( e.Name ) )
-			{
+            // Remove any watcher
+            if (e.Name != null && File.Exists(e.Name))
+            {
+                presenter.RemoveWatcher();
+
 				Version version = Environment.Version;
 				foreach( TestAssemblyInfo info in TestLoader.AssemblyInfo )
 					if ( info.ImageRuntimeVersion < version )
@@ -1643,7 +1685,20 @@ namespace NUnit.Gui
 			runCount.Text = "";
 		}
 
-		private void OnTestLoadStarting( object sender, TestEventArgs e )
+        private void OnProjectLoadFailure(object sender, TestEventArgs e)
+        {
+            MessageDisplay.Error("Project Not Loaded", e.Exception);
+
+            recentFilesService.Remove(e.Name);
+
+            EnableRunCommand(IsProjectLoaded);
+        }
+
+        #endregion
+
+        #region Event Handlers for Test Load and Unload
+
+        private void OnTestLoadStarting(object sender, TestEventArgs e)
 		{
 			EnableRunCommand( false );
 			longOpDisplay = new LongRunningOperationDisplay( this, "Loading..." );
@@ -1678,7 +1733,7 @@ namespace NUnit.Gui
 				foreach( TestAssemblyInfo info in TestLoader.AssemblyInfo )
 					if ( info.TestFrameworks.Count > 0 ) return;
 
-				UserMessage.Display( "This assembly was not built with any known testing framework.", "Not a Test Assembly");
+                MessageDisplay.Error("This assembly was not built with any known testing framework.");
 			}
 		}
 
@@ -1715,17 +1770,8 @@ namespace NUnit.Gui
 			EnableRunCommand( true );
 		}
 
-		private void OnProjectLoadFailure( object sender, TestEventArgs e )
-		{
-			UserMessage.DisplayFailure( e.Exception, "Project Not Loaded" );
-
-			recentFilesService.Remove( e.Name );
-
-			EnableRunCommand( true );
-		}
-
 		/// <summary>
-		/// Event handler for assembly load faiulres. We do this via
+		/// Event handler for assembly load failures. We do this via
 		/// an event since some errors may occur asynchronously.
 		/// </summary>
 		private void OnTestLoadFailure( object sender, TestEventArgs e )
@@ -1736,14 +1782,17 @@ namespace NUnit.Gui
 				longOpDisplay = null;
 			}
 			
-			string message = null;
+			string message = e.Action == NUnit.Util.TestAction.TestReloadFailed
+                ? "Test reload failed!"
+                : "Test load failed!";
 			if ( e.Exception is BadImageFormatException )
-				message = string.Format(
+				message += string.Format(
+                    Environment.NewLine + Environment.NewLine +
 					@"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}) 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" );
+            MessageDisplay.Error(message, e.Exception);
 
 			if ( !IsTestLoaded )
 				OnTestUnloaded( sender, e );
@@ -1771,7 +1820,7 @@ the version under which NUnit is currently running ({0}) or trying to load a 64-
 			if ( e.Exception != null )
 			{
 				if ( ! ( e.Exception is System.Threading.ThreadAbortException ) )
-					UserMessage.DisplayFailure( e.Exception, "NUnit Test Run Failed" );
+                    MessageDisplay.Error("NUnit Test Run Failed", e.Exception);
 			}
 
 			ResultSummarizer summary = new ResultSummarizer( e.Result );
@@ -1779,7 +1828,16 @@ the version under which NUnit is currently running ({0}) or trying to load a 64-
                 "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 );
+            try
+            {
+                TestLoader.SaveLastResult("TestResult.xml");
+            }
+            catch (Exception ex)
+            {
+                log.Warning("Unable to save TestResult.xml\n{0}", ex.ToString());
+            }
+
+            EnableRunCommand(true);
 
             if (e.Result.ResultState == ResultState.Failure ||
                 e.Result.ResultState == ResultState.Error ||
diff --git a/src/GuiRunner/nunit-gui/NUnitPresenter.cs b/src/GuiRunner/nunit-gui/NUnitPresenter.cs
new file mode 100644
index 0000000..b7abd6b
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/NUnitPresenter.cs
@@ -0,0 +1,550 @@
+// ****************************************************************
+// 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.Diagnostics;
+using System.IO;
+using System.Windows.Forms;
+using NUnit.Core;
+using NUnit.Util;
+using NUnit.UiKit;
+
+namespace NUnit.Gui
+{
+	/// <summary>
+	/// NUnitPresenter does all file opening and closing that
+	/// involves interacting with the user.
+    /// 
+    /// NOTE: This class originated as the static class
+    /// TestLoaderUI and is slowly being converted to a
+    /// true presenter. Current limitations include:
+    /// 
+    /// 1. At this time, the presenter is created by
+    /// the form and interacts with it directly, rather
+    /// than through an interface. 
+    /// 
+    /// 2. Many functions, which should properly be in
+    /// the presenter, remain in the form.
+    /// 
+    /// 3. The presenter creates dialogs itself, which
+    /// limits testability.
+	/// </summary>
+    public class NUnitPresenter
+    {
+        #region Instance Variables
+
+        private NUnitForm form;
+        private TestLoader loader;
+
+        // Our nunit project watcher
+        private FileWatcher projectWatcher;
+
+        #endregion
+
+        #region Constructor
+
+        // TODO: Use an interface for view and model
+        public NUnitPresenter(NUnitForm form, TestLoader loader)
+        {
+            this.form = form;
+            this.loader = loader;
+        }
+
+        #endregion
+
+        #region Public Properties
+
+        public NUnitForm Form
+        {
+            get { return form; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        #region New Project Methods
+
+        public void NewProject()
+        {
+            if (loader.IsProjectLoaded)
+                CloseProject();
+
+            SaveFileDialog dlg = new SaveFileDialog();
+            dlg.Title = "New Test Project";
+            dlg.Filter = "NUnit Test Project (*.nunit)|*.nunit|All Files (*.*)|*.*";
+            dlg.FileName = Services.ProjectService.GenerateProjectName();
+            dlg.DefaultExt = "nunit";
+            dlg.ValidateNames = true;
+            dlg.OverwritePrompt = true;
+
+            if (dlg.ShowDialog(Form) == DialogResult.OK)
+                loader.NewProject(dlg.FileName);
+        }
+
+        #endregion
+
+        #region Open Methods
+
+        public void OpenProject()
+		{
+			OpenFileDialog dlg = new OpenFileDialog();
+			System.ComponentModel.ISite site = Form == null ? null : Form.Site;
+			if ( site != null ) dlg.Site = site;
+			dlg.Title = "Open Project";
+			
+			if ( VisualStudioSupport )
+			{
+                dlg.Filter =
+					"Projects & Assemblies(*.nunit,*.csproj,*.vbproj,*.vjsproj, *.vcproj,*.sln,*.dll,*.exe )|*.nunit;*.csproj;*.vjsproj;*.vbproj;*.vcproj;*.sln;*.dll;*.exe|" +
+					"All Project Types (*.nunit,*.csproj,*.vbproj,*.vjsproj,*.vcproj,*.sln)|*.nunit;*.csproj;*.vjsproj;*.vbproj;*.vcproj;*.sln|" +
+                    "Test Projects (*.nunit)|*.nunit|" +
+                    "Solutions (*.sln)|*.sln|" +
+                    "C# Projects (*.csproj)|*.csproj|" +
+                    "J# Projects (*.vjsproj)|*.vjsproj|" +
+                    "VB Projects (*.vbproj)|*.vbproj|" +
+                    "C++ Projects (*.vcproj)|*.vcproj|" +
+                    "Assemblies (*.dll,*.exe)|*.dll;*.exe";
+			}
+			else
+			{
+                dlg.Filter =
+                    "Projects & Assemblies(*.nunit,*.dll,*.exe)|*.nunit;*.dll;*.exe|" +
+                    "Test Projects (*.nunit)|*.nunit|" +
+                    "Assemblies (*.dll,*.exe)|*.dll;*.exe";
+			}
+
+			dlg.FilterIndex = 1;
+			dlg.FileName = "";
+
+			if ( dlg.ShowDialog( Form ) == DialogResult.OK ) 
+				OpenProject( dlg.FileName );
+		}
+
+        public void WatchProject(string projectPath)
+        {
+            this.projectWatcher = new FileWatcher(projectPath, 100);
+
+            this.projectWatcher.Changed += new FileChangedHandler(OnTestProjectChanged);
+            this.projectWatcher.Start();
+        }
+
+        public void RemoveWatcher()
+        {
+            if (projectWatcher != null)
+            {
+                projectWatcher.Stop();
+                projectWatcher.Dispose();
+                projectWatcher = null;
+            }
+        }
+
+        private void OnTestProjectChanged(string filePath)
+        {
+            string message = filePath + Environment.NewLine + Environment.NewLine +
+                "This file has been modified outside of NUnit." + Environment.NewLine +
+                "Do you want to reload it?";
+
+            if (Form.MessageDisplay.Ask(message) == DialogResult.Yes)
+                ReloadProject();
+        }
+
+        public void OpenProject(string testFileName, string configName, string testName)
+		{
+			if ( loader.IsProjectLoaded && SaveProjectIfDirty() == DialogResult.Cancel )
+				return;
+
+			loader.LoadProject( testFileName, configName );
+			if ( loader.IsProjectLoaded )
+			{	
+				NUnitProject testProject = loader.TestProject;
+				if ( testProject.Configs.Count == 0 )
+                    Form.MessageDisplay.Info("Loaded project contains no configuration data");
+				else if ( testProject.ActiveConfig == null )
+                    Form.MessageDisplay.Info("Loaded project has no active configuration");
+				else if ( testProject.ActiveConfig.Assemblies.Count == 0 )
+                    Form.MessageDisplay.Info("Active configuration contains no assemblies");
+				else
+					loader.LoadTest( testName );
+			}
+		}
+
+		public void OpenProject( string testFileName )
+		{
+			OpenProject( testFileName, null, null );
+		}
+
+//		public static void OpenResults( Form owner )
+//		{
+//			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 );
+        //		}
+
+        #endregion
+
+        #region Close Methods
+
+        public DialogResult CloseProject()
+        {
+            DialogResult result = SaveProjectIfDirty();
+
+            if (result != DialogResult.Cancel)
+                loader.UnloadProject();
+
+            return result;
+        }
+
+        #endregion
+
+        #region Add Methods
+
+        public void AddToProject()
+		{
+			AddToProject( null );
+		}
+        // TODO: Not used?
+		public void AddToProject( string configName )
+		{
+			ProjectConfig config = configName == null
+				? loader.TestProject.ActiveConfig
+				: loader.TestProject.Configs[configName];
+
+			OpenFileDialog dlg = new OpenFileDialog();
+			dlg.Title = "Add Assemblies To Project";
+			dlg.InitialDirectory = config.BasePath;
+
+			if ( VisualStudioSupport )
+				dlg.Filter =
+					"Projects & Assemblies(*.csproj,*.vbproj,*.vjsproj, *.vcproj,*.dll,*.exe )|*.csproj;*.vjsproj;*.vbproj;*.vcproj;*.dll;*.exe|" +
+					"Visual Studio Projects (*.csproj,*.vjsproj,*.vbproj,*.vcproj)|*.csproj;*.vjsproj;*.vbproj;*.vcproj|" +
+					"C# Projects (*.csproj)|*.csproj|" +
+					"J# Projects (*.vjsproj)|*.vjsproj|" +
+					"VB Projects (*.vbproj)|*.vbproj|" +
+					"C++ Projects (*.vcproj)|*.vcproj|" +
+					"Assemblies (*.dll,*.exe)|*.dll;*.exe";
+			else
+				dlg.Filter = "Assemblies (*.dll,*.exe)|*.dll;*.exe";
+
+			dlg.FilterIndex = 1;
+			dlg.FileName = "";
+
+			if ( dlg.ShowDialog( Form ) != DialogResult.OK )
+				return;
+
+            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 = Form.MessageDisplay.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)
+                {
+                    Form.MessageDisplay.Error("Invalid VS Project", ex);
+                }
+        }
+
+		public void AddAssembly()
+		{
+			AddAssembly( null );
+		}
+
+		public void AddAssembly( string configName )
+		{
+			ProjectConfig config = configName == null
+				? loader.TestProject.ActiveConfig
+				: loader.TestProject.Configs[configName];
+
+			OpenFileDialog dlg = new OpenFileDialog();
+			dlg.Title = "Add Assembly";
+			dlg.InitialDirectory = config.BasePath;
+            dlg.Filter = "Assemblies (*.dll,*.exe)|*.dll;*.exe";
+			dlg.FilterIndex = 1;
+			dlg.FileName = "";
+
+            if (dlg.ShowDialog(Form) == DialogResult.OK)
+                config.Assemblies.Add(dlg.FileName);
+		}
+
+		public void AddVSProject()
+		{
+			OpenFileDialog dlg = new OpenFileDialog();
+			dlg.Title = "Add Visual Studio Project";
+
+			dlg.Filter =
+				"All Project Types (*.csproj,*.vjsproj,*.vbproj,*.vcproj)|*.csproj;*.vjsproj;*.vbproj;*.vcproj|" +
+				"C# Projects (*.csproj)|*.csproj|" +
+				"J# Projects (*.vjsproj)|*.vjsproj|" +
+				"VB Projects (*.vbproj)|*.vbproj|" +
+				"C++ Projects (*.vcproj)|*.vcproj|" +
+				"All Files (*.*)|*.*";
+
+			dlg.FilterIndex = 1;
+			dlg.FileName = "";
+
+			if ( dlg.ShowDialog( Form ) == DialogResult.OK ) 
+			{
+				try
+				{
+					VSProject vsProject = new VSProject( dlg.FileName );
+					loader.TestProject.Add( vsProject );
+				}
+				catch( Exception ex )
+				{
+                    Form.MessageDisplay.Error("Invalid VS Project", ex);
+				}
+			}
+        }
+
+        #endregion
+
+        #region Save Methods
+
+        public void SaveProject()
+		{
+			if ( Path.IsPathRooted( loader.TestProject.ProjectPath ) &&
+				 NUnitProject.IsNUnitProjectFile( loader.TestProject.ProjectPath ) &&
+				 CanWriteProjectFile( loader.TestProject.ProjectPath ) )
+				loader.TestProject.Save();
+			else
+				SaveProjectAs();
+		}
+
+		public void SaveProjectAs()
+		{
+			SaveFileDialog dlg = new SaveFileDialog();
+			dlg.Title = "Save Test Project";
+			dlg.Filter = "NUnit Test Project (*.nunit)|*.nunit|All Files (*.*)|*.*";
+			string path = NUnitProject.ProjectPathFromFile( loader.TestProject.ProjectPath );
+			if ( CanWriteProjectFile( path ) )
+				dlg.FileName = path;
+			dlg.DefaultExt = "nunit";
+			dlg.ValidateNames = true;
+			dlg.OverwritePrompt = true;
+
+			while( dlg.ShowDialog( Form ) == DialogResult.OK )
+			{
+				if ( !CanWriteProjectFile( dlg.FileName ) )
+                    Form.MessageDisplay.Info(string.Format("File {0} is write-protected. Select another file name.", dlg.FileName));
+				else
+				{
+					loader.TestProject.Save( dlg.FileName );
+                    ReloadProject();
+                    return;
+				}
+			}
+        }
+
+        private DialogResult SaveProjectIfDirty()
+        {
+            DialogResult result = DialogResult.OK;
+            NUnitProject project = loader.TestProject;
+
+            if (project.IsDirty)
+            {
+                string msg = string.Format(
+                    "Project {0} has been changed. Do you want to save changes?", project.Name);
+
+                result = Form.MessageDisplay.Ask(msg, MessageBoxButtons.YesNoCancel);
+                if (result == DialogResult.Yes)
+                    SaveProject();
+            }
+
+            return result;
+        }
+
+        public void SaveLastResult()
+        {
+            //TODO: Save all results
+            SaveFileDialog dlg = new SaveFileDialog();
+            dlg.Title = "Save Test Results as XML";
+            dlg.Filter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*";
+            dlg.FileName = "TestResult.xml";
+            dlg.InitialDirectory = Path.GetDirectoryName(loader.TestFileName);
+            dlg.DefaultExt = "xml";
+            dlg.ValidateNames = true;
+            dlg.OverwritePrompt = true;
+
+            if (dlg.ShowDialog(Form) == DialogResult.OK)
+            {
+                try
+                {
+                    string fileName = dlg.FileName;
+
+                    loader.SaveLastResult(fileName);
+
+                    Form.MessageDisplay.Info(String.Format("Results saved as {0}", fileName));
+                }
+                catch (Exception exception)
+                {
+                    Form.MessageDisplay.Error("Unable to Save Results", exception);
+                }
+            }
+        }
+
+        #endregion
+
+        #region Reload Methods
+
+        public void ReloadProject()
+        {
+            NUnitProject project = loader.TestProject;
+
+            bool wrapper = project.IsAssemblyWrapper;
+            string projectPath = project.ProjectPath;
+            string activeConfigName = project.ActiveConfigName;
+
+            // Unload first to avoid message asking about saving
+            loader.UnloadProject();
+
+            if (wrapper)
+                OpenProject(projectPath);
+            else
+                OpenProject(projectPath, activeConfigName, null);
+        }
+
+        #endregion
+
+        #region Edit Project
+
+        public void EditProject()
+        {
+            NUnitProject project = loader.TestProject;
+
+            string editorPath = GetProjectEditorPath();
+            if (!File.Exists(editorPath))
+            {
+                string NL = Environment.NewLine;
+                string message =
+                    "Unable to locate the specified Project Editor:" + NL + NL + editorPath + NL + NL +
+                    (Services.UserSettings.GetSetting("Options.ProjectEditor.EditorPath") == null
+                        ? "Verify that nunit.editor.exe is properly installed in the NUnit bin directory."
+                        : "Verify that you have set the path to the editor correctly.");
+
+                Form.MessageDisplay.Error(message);
+
+                return;
+            }
+
+            if (!NUnitProject.IsNUnitProjectFile(project.ProjectPath))
+            {
+                if (Form.MessageDisplay.Display(
+                    "The project has not yet been saved. In order to edit the project, it must first be saved. Click OK to save the project or Cancel to exit.",
+                    MessageBoxButtons.OKCancel) == DialogResult.OK)
+                {
+                    project.Save();
+                }
+            }
+            else if (!File.Exists(project.ProjectPath))
+            {
+                project.Save();
+            }
+            else if (project.IsDirty)
+            {
+                switch (Form.MessageDisplay.Ask(
+                    "There are unsaved changes. Do you want to save them before running the editor?",
+                    MessageBoxButtons.YesNoCancel))
+                {
+                    case DialogResult.Yes:
+                        project.Save();
+                        break;
+
+                    case DialogResult.Cancel:
+                        return;
+                }
+            }
+
+            // In case we tried to save project and failed
+            if (NUnitProject.IsNUnitProjectFile(project.ProjectPath) && File.Exists(project.ProjectPath))
+            {
+                Process p = new Process();
+
+                p.StartInfo.FileName = Quoted(editorPath);
+                p.StartInfo.Arguments = Quoted(project.ProjectPath);
+                p.Start();
+            }
+        }
+
+        #endregion
+
+        #endregion
+
+        #region Helper Properties and Methods
+
+        private static bool VisualStudioSupport
+        {
+            get
+            {
+                return Services.UserSettings.GetSetting("Options.TestLoader.VisualStudioSupport", false);
+            }
+        }
+
+        private static bool CanWriteProjectFile(string path)
+        {
+            return !File.Exists(path) ||
+                (File.GetAttributes(path) & FileAttributes.ReadOnly) == 0;
+        }
+
+        private static string GetProjectEditorPath()
+        {
+            string editorPath = (string)Services.UserSettings.GetSetting("Options.ProjectEditor.EditorPath");
+            if (editorPath == null)
+                editorPath = Path.Combine(NUnitConfiguration.NUnitBinDirectory, "nunit-editor.exe");
+
+            return editorPath;
+        }
+
+        private static string Quoted(string s)
+        {
+            return "\"" + s + "\"";
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/OptionsDialog.cs b/src/GuiRunner/nunit-gui/OptionsDialog.cs
index 19fe7a9..2d6f85c 100644
--- a/src/GuiRunner/nunit-gui/OptionsDialog.cs
+++ b/src/GuiRunner/nunit-gui/OptionsDialog.cs
@@ -24,8 +24,10 @@ namespace NUnit.Gui
 				new TreeSettingsPage("Gui.Tree Display"),
 				new TestResultSettingsPage("Gui.Test Results"),
 				new TextOutputSettingsPage("Gui.Text Output"),
-				new TestLoaderSettingsPage("Test Loader.Assembly Isolation"),
+                new ProjectEditorSettingsPage("Gui.Project Editor"),
+                new TestLoaderSettingsPage("Test Loader.Assembly Isolation"),
 				new AssemblyReloadSettingsPage("Test Loader.Assembly Reload"),
+                new RuntimeSelectionSettingsPage("Test Loader.Runtime Selection"),
 				new AdvancedLoaderSettingsPage("Test Loader.Advanced"),
 				new VisualStudioSettingsPage("IDE Support.Visual Studio"),
                 new InternalTraceSettingsPage("Advanced Settings.Internal Trace"));
diff --git a/src/GuiRunner/nunit-gui/ProjectEditor.cs b/src/GuiRunner/nunit-gui/ProjectEditor.cs
deleted file mode 100644
index 4fb6a3c..0000000
--- a/src/GuiRunner/nunit-gui/ProjectEditor.cs
+++ /dev/null
@@ -1,1266 +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.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.UiKit;
-using NUnit.Core;
-
-namespace NUnit.Gui
-{
-	public class ProjectEditor : System.Windows.Forms.Form
-	{
-		#region Instance Variables
-
-		private NUnitProject project;
-		private ProjectConfig selectedConfig;
-		private string selectedAssembly;
-		private System.Windows.Forms.ColumnHeader fileNameHeader;
-		private System.Windows.Forms.ColumnHeader fullPathHeader;
-		private System.Windows.Forms.Button closeButton;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.Windows.Forms.Label label5;
-		private CP.Windows.Forms.ExpandingLabel projectPathLabel;
-		private System.Windows.Forms.Label label8;
-		private System.Windows.Forms.TextBox projectBaseTextBox;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.TabControl projectTabControl;
-		private System.Windows.Forms.TabPage generalTabPage;
-		private System.Windows.Forms.RadioButton autoBinPathRadioButton;
-		private System.Windows.Forms.RadioButton manualBinPathRadioButton;
-		private System.Windows.Forms.RadioButton noBinPathRadioButton;
-		private System.Windows.Forms.TextBox privateBinPathTextBox;
-		private System.Windows.Forms.Label label6;
-		private System.Windows.Forms.TextBox configFileTextBox;
-		private System.Windows.Forms.Label label4;
-		private System.Windows.Forms.TextBox applicationBaseTextBox;
-		private System.Windows.Forms.Label label3;
-		private System.Windows.Forms.TabPage assemblyTabPage;
-		private System.Windows.Forms.ListBox assemblyListBox;
-		private System.Windows.Forms.Button addAssemblyButton;
-		private System.Windows.Forms.Button editConfigsButton;
-		private System.Windows.Forms.ComboBox configComboBox;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Button configBaseBrowseButton;
-		private System.Windows.Forms.Button projectBaseBrowseButton;
-		private System.Windows.Forms.Button removeAssemblyButton;
-		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
-
-		#region Construction and Disposal
-
-		public ProjectEditor( NUnitProject project )
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			this.project = project;
-		}
-
-		/// <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 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.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();
-
-		}
-		#endregion
-
-		#region Config ComboBox Methods and Events
-
-		private void configComboBox_Populate()
-		{
-			configComboBox.Items.Clear();
-
-			if ( selectedConfig == null )
-				selectedConfig = project.ActiveConfig;
-
-			int selectedIndex = -1; 
-			foreach( ProjectConfig config in project.Configs )
-			{
-				string name = config.Name;
-				int index = configComboBox.Items.Add( name );
-				if ( name == selectedConfig.Name )
-					selectedIndex = index;
-			}
-
-			if ( selectedIndex == -1 && configComboBox.Items.Count > 0 )
-			{
-				selectedIndex = 0;
-				selectedConfig = project.Configs[0];
-			}
-
-			if ( selectedIndex == -1 )
-				selectedConfig = null;
-			else
-				configComboBox.SelectedIndex = selectedIndex;
-		
-			addAssemblyButton.Enabled = removeAssemblyButton.Enabled = project.Configs.Count > 0;
-		}
-
-		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;
-
-			configFileTextBox.Text = selectedConfig.ConfigurationFile;
-
-			switch ( selectedConfig.BinPathType )
-			{
-				case BinPathType.Auto:
-					autoBinPathRadioButton.Checked = true;
-					break;
-
-				case BinPathType.Manual:
-					manualBinPathRadioButton.Checked = true;
-					privateBinPathTextBox.Text = selectedConfig.PrivateBinPath;
-					break;
-
-				default:
-					noBinPathRadioButton.Checked = true;
-					break;
-			}
-
-			assemblyListBox_Populate();
-		}
-
-		#endregion
-
-		#region Assembly ListBox Methods and Events
-
-		private void assemblyListBox_Populate()
-		{
-			assemblyListBox.Items.Clear();
-			int selectedIndex = -1;
-
-			foreach( string assembly in selectedConfig.Assemblies )
-			{
-				int index = assemblyListBox.Items.Add( Path.GetFileName( assembly ) );
-
-				if ( assembly == selectedAssembly )
-					selectedIndex = index;
-			}
-
-			if ( assemblyListBox.Items.Count > 0 && selectedIndex == -1)
-				selectedIndex = 0;
-
-            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)
-		{
-			if ( assemblyListBox.SelectedIndex == -1 )
-			{
-				assemblyPathTextBox.Text = selectedAssembly = null;
-                removeAssemblyButton.Enabled = false;
-                assemblyPathBrowseButton.Enabled = false;
-            }
-			else 
-			{
-				assemblyPathTextBox.Text = selectedAssembly = //(string)assemblyListBox.SelectedItem;
-					selectedConfig.Assemblies[assemblyListBox.SelectedIndex];
-				removeAssemblyButton.Enabled = true;
-                assemblyPathBrowseButton.Enabled = true;
-            }
-		}
-
-		#endregion
-
-		#region Project Base Methods and Events
-		private void projectBaseBrowseButton_Click(object sender, System.EventArgs e)
-		{
-            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)
-		{
-			if ( projectBaseTextBox.Text != string.Empty )
-			{
-				string projectBase = null;
-				try
-				{
-					projectBase = projectBaseTextBox.Text;
-					Directory.Exists( projectBase );
-				}
-				catch( Exception ex )
-				{
-					projectBaseTextBox.SelectAll();
-					UserMessage.DisplayFailure( ex, "Invalid Project Base" );
-					e.Cancel = true;
-				}
-
-				if ( !Directory.Exists( projectBase ) )
-				{
-					string msg = string.Format( 
-						"The directory {0} does not exist. Do you want to create it?", 
-						projectBase );
-					switch ( UserMessage.Ask( msg, "Project Editor" ) )
-					{
-						case DialogResult.Yes:
-							Directory.CreateDirectory( projectBase );
-							break;
-						case DialogResult.Cancel:
-							e.Cancel = true;
-							break;
-						case DialogResult.No:
-						default:
-							break;
-					}
-				}
-			}
-		}
-
-		private void projectBaseTextBox_Validated(object sender, System.EventArgs e)
-		{
-			UpdateProjectBase( projectBaseTextBox.Text );
-		}
-
-		private void UpdateProjectBase( string projectBase )
-		{
-			if ( projectBase == string.Empty )
-				projectBase = project.DefaultBasePath;
-
-			project.BasePath = projectBaseTextBox.Text = projectBase;
-		}
-		#endregion
-
-		#region Config Base Methods and Events
-		private void configBaseBrowseButton_Click(object sender, System.EventArgs e)
-		{
-            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)
-		{
-			if ( applicationBaseTextBox.Text != String.Empty )
-			{
-				string applicationBase = null;
-
-				try
-				{
-					applicationBase = Path.Combine( project.BasePath, applicationBaseTextBox.Text );
-					Directory.Exists( applicationBase );
-				}
-				catch( Exception exception )
-				{
-					applicationBaseTextBox.SelectAll();
-					UserMessage.DisplayFailure( exception, "Invalid ApplicationBase" );
-					e.Cancel = true;
-				}
-
-	/*			if ( !PathUtils.SamePathOrUnder( project.BasePath, applicationBase ) )
-				{
-					applicationBaseTextBox.SelectAll();
-					UserMessage.DisplayFailure( "Path must be equal to or under the project base", "Invalid Entry" );
-					e.Cancel = true;
-				}			
-				else */
-				if ( !Directory.Exists( applicationBase ) )
-				{
-					string msg = string.Format( 
-						"The directory {0} does not exist. Do you want to create it?", 
-						applicationBase );
-					switch ( UserMessage.Ask( msg, "Project Editor" ) )
-					{
-						case DialogResult.Yes:
-							Directory.CreateDirectory( applicationBase );
-							break;
-						case DialogResult.Cancel:
-							e.Cancel = true;
-							break;
-						case DialogResult.No:
-						default:
-							break;
-					}
-				}
-			}
-		}
-
-		private void applicationBaseTextBox_Validated(object sender, System.EventArgs e)
-		{
-			UpdateApplicationBase( applicationBaseTextBox.Text );
-		}
-
-		private void UpdateApplicationBase( string appbase )
-		{
-			string basePath = null;
-
-			if ( appbase != String.Empty )
-			{
-				basePath = Path.Combine( project.BasePath, appbase );
-				if ( PathUtils.SamePath( project.BasePath, basePath ) )
-					basePath = null;
-			}
-
-			selectedConfig.BasePath = basePath;
-
-			// TODO: Test what happens if we set it the same as project base
-			if ( selectedConfig.RelativeBasePath == null )
-				applicationBaseTextBox.Text = string.Empty;
-			else
-				applicationBaseTextBox.Text = selectedConfig.RelativeBasePath;
-		}
-		#endregion
-
-		#region Config File Methods and Events
-		private void configFileTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
-		{
-			string configFile = configFileTextBox.Text;
-			if ( configFile != String.Empty )
-			{
-                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 ) )
-				{
-					configFileTextBox.SelectAll();
-					UserMessage.DisplayFailure( "Specify configuration file as filename and extension only", "Invalid Entry" );
-					e.Cancel = true;
-				}
-			}
-		}
-
-		private void configFileTextBox_Validated(object sender, System.EventArgs e)
-		{
-			if ( configFileTextBox.Text == String.Empty )
-				selectedConfig.ConfigurationFile = null;
-			else
-				selectedConfig.ConfigurationFile = configFileTextBox.Text;
-		}
-		#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)
-		{
-			string binPath = privateBinPathTextBox.Text;
-			if ( binPath != String.Empty )
-			{
-				string[] elements = binPath.Split( new char[] { ';' } );
-				foreach( string element in elements ) 
-				{
-					try
-					{
-						Directory.Exists( element );
-					}
-					catch(System.Exception exception)
-					{
-						privateBinPathTextBox.Select( binPath.IndexOf( element ), element.Length );
-						UserMessage.DisplayFailure( exception, "Invalid Path: " + element );
-						e.Cancel = true;
-					}
-				}
-			}
-		}
-
-		private void privateBinPathTextBox_Validated(object sender, System.EventArgs e)
-		{
-			if ( privateBinPathTextBox.Text == String.Empty )
-				selectedConfig.PrivateBinPath = null;
-			else
-				selectedConfig.PrivateBinPath = privateBinPathTextBox.Text;
-		}
-
-        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)
-		{
-			OpenFileDialog dlg = new OpenFileDialog();
-			dlg.Title = "Select Assembly";
-			
-			dlg.Filter =
-				"Assemblies (*.dll,*.exe)|*.dll;*.exe|" +
-				"All Files (*.*)|*.*";
-
-			dlg.InitialDirectory = System.IO.Path.GetDirectoryName( assemblyPathTextBox.Text );
-			dlg.FilterIndex = 1;
-			dlg.FileName = "";
-
-			if ( dlg.ShowDialog( this ) == DialogResult.OK ) 
-			{
-				selectedConfig.Assemblies[assemblyListBox.SelectedIndex] = dlg.FileName;
-				assemblyListBox_Populate();
-            }
-		}
-
-		private void assemblyPathTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
-		{
-			string path = assemblyPathTextBox.Text;
-
-            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)
-		{
-			selectedConfig.Assemblies[assemblyListBox.SelectedIndex] = assemblyPathTextBox.Text;
-			assemblyListBox_Populate();
-		}
-		#endregion
-
-		#region Other UI Events
-
-		private void ProjectEditor_Load(object sender, System.EventArgs e)
-		{
-			this.Text = string.Format( "{0} - Project Editor", 
-				project.Name );
-
-			projectPathLabel.Text = project.ProjectPath;
-			projectBaseTextBox.Text = project.BasePath;
-
-            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)
-		{
-			using( ConfigurationEditor editor = new ConfigurationEditor( project ) )
-			{
-				this.Site.Container.Add( editor );
-				editor.ShowDialog();
-			}
-			configComboBox_Populate();
-		}
-
-		private void addAssemblyButton_Click(object sender, System.EventArgs e)
-		{
-			TestLoaderUI.AddToProject( this, selectedConfig.Name );
-			assemblyListBox_Populate();
-		}
-
-		private void removeAssemblyButton_Click(object sender, System.EventArgs e)
-		{
-			if ( UserMessage.Ask( string.Format(
-				"Remove {0} from project?", selectedAssembly ) ) == DialogResult.Yes )
-			{
-				int index = assemblyListBox.SelectedIndex;
-				selectedConfig.Assemblies.RemoveAt( index );
-
-				assemblyListBox.Items.RemoveAt( index );
-				if ( index >= assemblyListBox.Items.Count )
-					--index;
-
-				if ( index >= 0 )
-				{
-					selectedAssembly = (string)assemblyListBox.Items[index];
-					assemblyListBox.SelectedIndex = index;
-				}
-				else
-					selectedAssembly = null;
-			}
-		}
-
-		private void closeButton_Click(object sender, System.EventArgs e)
-		{
-			this.Close();		
-		}
-
-        #endregion
-	}
-}
diff --git a/src/GuiRunner/nunit-gui/ProjectEditor.resx b/src/GuiRunner/nunit-gui/ProjectEditor.resx
deleted file mode 100644
index ea10b78..0000000
--- a/src/GuiRunner/nunit-gui/ProjectEditor.resx
+++ /dev/null
@@ -1,167 +0,0 @@
-<?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>
-  <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="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="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.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
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
-        ////////////////////////////////////////qqqqqv///6qq/5mZmZn//6qqqqr///+qqvmZmZmZ
-        n/+qqqqq///6qqqZmf//mZn//6qv////+qqqmZ////mZ//+qr////6qqqpmf///5mf//qq////+qqqqZ
-        n///+Zn//6qv///6qqqqmZ////mZ//+qr///+qqqqpmf///5mf//qq///6qq+qqZn///+Zn//6qv//qq
-        qvqqmZ////mZ//+qr//6qq/6qpmf///5mf//qq//qqqv+qqZn///+Zn//6qv/6qq//qZmZmf+ZmZmf+q
-        r/qqqv/6mZmZn/mZmZn/qq/6qq//+qr//////////6qvqqqv//qq//////////+qqqqq///6qv//////
-        ////qqqqqv//+qr//////////6qqqq////qq/////////6qqqqqv/6qqqqqv//////+qqqqq//+qqqqq
-        r///////qqqqqv//qqqqqq//////////////////////////////////////////////////////////
-        ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA
-        AACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AGZmZmZmZmZmZmZmZmZm
-        Zmb/////////////////////qqr/qv+Zn//6r/qq+f/5//qv+qr5//n/+q+qqvn/+f/6r6+q+f/5//qq
-        r6qZn5mf+qqvqv////+qqvqqr///////////////////////////////////////////////AAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/RecentFileMenuHandler.cs b/src/GuiRunner/nunit-gui/RecentFileMenuHandler.cs
new file mode 100644
index 0000000..fdfc1bb
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/RecentFileMenuHandler.cs
@@ -0,0 +1,92 @@
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.Gui
+{
+	public class RecentFileMenuHandler
+	{
+		private MenuItem menu;
+		private RecentFiles recentFiles;
+        private bool checkFilesExist = true;
+		private bool showNonRunnableFiles = false;
+
+		public RecentFileMenuHandler( MenuItem menu, RecentFiles recentFiles )
+		{
+			this.menu = menu;
+			this.recentFiles = recentFiles;
+		}
+
+		public bool CheckFilesExist
+		{
+			get { return checkFilesExist; }
+			set { checkFilesExist = value; }
+		}
+
+		public bool ShowNonRunnableFiles
+		{
+			get { return showNonRunnableFiles; }
+			set { showNonRunnableFiles = value; }
+		}
+
+		public MenuItem Menu
+		{
+			get { return menu; }
+		}
+
+		public string this[int index]
+		{
+			get { return menu.MenuItems[index].Text.Substring( 2 ); }
+		}
+
+		public void Load()
+		{
+			if ( recentFiles.Count == 0 )
+				Menu.Enabled = false;
+			else 
+			{
+				Menu.Enabled = true;
+				Menu.MenuItems.Clear();
+				int index = 1;
+				foreach ( RecentFileEntry entry in recentFiles.Entries ) 
+				{
+                    // Rather than show files that don't exist, we skip them. As
+                    // 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 ( !checkFilesExist || entry.Exists )
+                    {
+						// NOTE: In the current version, all the files listed should
+						// have a compatible version, since we are using separate
+						// settings for V1 and V2. This code will be changed in
+						// a future release to allow running under other runtimes.
+						if ( showNonRunnableFiles || entry.IsCompatibleCLRVersion )
+						{
+							MenuItem item = new MenuItem(String.Format("{0} {1}", index++, entry.Path));
+							item.Click += new System.EventHandler(OnRecentFileClick);
+							Menu.MenuItems.Add(item);
+						}
+                    }
+				}		
+			}
+		}
+
+		private void OnRecentFileClick( object sender, EventArgs e )
+		{
+			MenuItem item = (MenuItem) sender;
+			string testFileName = item.Text.Substring( 2 );
+
+            // TODO: Figure out a better way
+            NUnitForm form = item.GetMainMenu().GetForm() as NUnit.Gui.NUnitForm;
+            if ( form != null)
+                form.Presenter.OpenProject( testFileName ); 
+		}
+	}
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
index 5d1554d..3a5b9e5 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
@@ -7,6 +7,7 @@ using System;
 using System.Collections;
 using System.ComponentModel;
 using System.Drawing;
+using System.Security.Principal;
 using System.Windows.Forms;
 using NUnit.Util;
 
@@ -16,12 +17,17 @@ namespace NUnit.Gui.SettingsPages
 	{
 		private System.Windows.Forms.Label label3;
 		private System.Windows.Forms.GroupBox groupBox3;
-		private System.Windows.Forms.CheckBox enableShadowCopyCheckBox;
-		private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.CheckBox enableShadowCopyCheckBox;
 		private System.Windows.Forms.Label label2;
 		private System.Windows.Forms.HelpProvider helpProvider1;
         private Label label4;
         private TextBox shadowCopyPathTextBox;
+        private CheckBox principalPolicyCheckBox;
+        private Label label7;
+        private Label label6;
+        private GroupBox groupBox1;
+        private ListBox principalPolicyListBox;
+        private Label label1;
 		private System.ComponentModel.IContainer components = null;
 
 		public AdvancedLoaderSettingsPage( string key ) : base( key )
@@ -58,83 +64,147 @@ namespace NUnit.Gui.SettingsPages
             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.label4 = new System.Windows.Forms.Label();
+            this.principalPolicyCheckBox = new System.Windows.Forms.CheckBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.principalPolicyListBox = new System.Windows.Forms.ListBox();
+            this.label1 = new System.Windows.Forms.Label();
             this.SuspendLayout();
             // 
             // label3
             // 
+            this.label3.AutoSize = true;
             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.Size = new System.Drawing.Size(73, 13);
+            this.label3.TabIndex = 0;
             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.Location = new System.Drawing.Point(139, 8);
             this.groupBox3.Name = "groupBox3";
-            this.groupBox3.Size = new System.Drawing.Size(344, 8);
-            this.groupBox3.TabIndex = 11;
+            this.groupBox3.Size = new System.Drawing.Size(309, 8);
+            this.groupBox3.TabIndex = 1;
             this.groupBox3.TabStop = false;
             // 
             // enableShadowCopyCheckBox
             // 
+            this.enableShadowCopyCheckBox.AutoSize = true;
             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.Size = new System.Drawing.Size(128, 17);
+            this.enableShadowCopyCheckBox.TabIndex = 2;
             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.Location = new System.Drawing.Point(139, 101);
             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.";
+            this.label2.Size = new System.Drawing.Size(260, 59);
+            this.label2.TabIndex = 6;
+            this.label2.Text = "Shadow copy should normally be enabled. If it is disabled, the NUnit Gui may not " +
+                "function correctly.";
+            // 
+            // 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, 20);
+            this.shadowCopyPathTextBox.TabIndex = 4;
             // 
             // 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.Size = new System.Drawing.Size(66, 13);
+            this.label4.TabIndex = 3;
             this.label4.Text = "Cache Path:";
             // 
-            // shadowCopyPathTextBox
+            // principalPolicyCheckBox
             // 
-            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;
+            this.principalPolicyCheckBox.AutoSize = true;
+            this.principalPolicyCheckBox.Location = new System.Drawing.Point(24, 199);
+            this.principalPolicyCheckBox.Name = "principalPolicyCheckBox";
+            this.principalPolicyCheckBox.Size = new System.Drawing.Size(214, 17);
+            this.principalPolicyCheckBox.TabIndex = 9;
+            this.principalPolicyCheckBox.Text = "Set Principal Policy for test AppDomains";
+            this.principalPolicyCheckBox.UseVisualStyleBackColor = true;
+            this.principalPolicyCheckBox.CheckedChanged += new System.EventHandler(this.principalPolicyCheckBox_CheckedChanged);
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(42, 225);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(38, 13);
+            this.label7.TabIndex = 10;
+            this.label7.Text = "Policy:";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(8, 163);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(78, 13);
+            this.label6.TabIndex = 7;
+            this.label6.Text = "Principal Policy";
+            // 
+            // 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(139, 163);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(309, 8);
+            this.groupBox1.TabIndex = 8;
+            this.groupBox1.TabStop = false;
+            // 
+            // principalPolicyListBox
+            // 
+            this.principalPolicyListBox.FormattingEnabled = true;
+            this.principalPolicyListBox.Items.AddRange(new object[] {
+            "UnauthenticatedPrincipal",
+            "NoPrincipal",
+            "WindowsPrincipal"});
+            this.principalPolicyListBox.Location = new System.Drawing.Point(139, 225);
+            this.principalPolicyListBox.Name = "principalPolicyListBox";
+            this.principalPolicyListBox.Size = new System.Drawing.Size(241, 69);
+            this.principalPolicyListBox.TabIndex = 11;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(42, 101);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(50, 13);
+            this.label1.TabIndex = 12;
+            this.label1.Text = "Warning:";
             // 
             // AdvancedLoaderSettingsPage
             // 
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.principalPolicyListBox);
+            this.Controls.Add(this.principalPolicyCheckBox);
+            this.Controls.Add(this.label7);
+            this.Controls.Add(this.label6);
+            this.Controls.Add(this.groupBox1);
             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);
@@ -151,26 +221,42 @@ namespace NUnit.Gui.SettingsPages
 
 			enableShadowCopyCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
             shadowCopyPathTextBox.Text = settings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
+
+            principalPolicyCheckBox.Checked = principalPolicyListBox.Enabled =
+                settings.GetSetting( "Options.TestLoader.SetPrincipalPolicy", false );
+            principalPolicyListBox.SelectedIndex = (int)(PrincipalPolicy)settings.GetSetting("Options.TestLoader.PrincipalPolicy", PrincipalPolicy.UnauthenticatedPrincipal);
 		}
 
 		public override void ApplySettings()
 		{
 			settings.SaveSetting( "Options.TestLoader.ShadowCopyFiles", enableShadowCopyCheckBox.Checked );
+
             if (shadowCopyPathTextBox.Text != "")
                 settings.SaveSetting("Options.TestLoader.ShadowCopyPath", shadowCopyPathTextBox.Text);
             else
                 settings.RemoveSetting("Options.TestLoader.ShadowCopyPath");
+
+            settings.SaveSetting("Options.TestLoader.SetPrincipalPolicy", principalPolicyCheckBox.Checked);
+
+            if (principalPolicyCheckBox.Checked)
+                settings.SaveSetting("Options.TestLoader.PrincipalPolicy", (PrincipalPolicy)principalPolicyListBox.SelectedIndex);
+            else
+                settings.RemoveSetting("Options.TestLoader.PrincipalPolicy");
 		}
 
 		public override bool HasChangesRequiringReload
 		{
 			get
 			{
-				bool oldSetting = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
-                string oldPath = settings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
+				bool oldShadowCopyFiles = settings.GetSetting( "Options.TestLoader.ShadowCopyFiles", true );
+                string oldShadowCopyPath = settings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
+                bool oldSetPrincipalPolicy = settings.GetSetting("Options.TestLoader.SetPrincipalPolicy", false);
+                PrincipalPolicy oldPrincipalPolicy = (PrincipalPolicy)settings.GetSetting("Options.TestLoader.PrincipalPolicy", PrincipalPolicy.UnauthenticatedPrincipal);
 
-				return enableShadowCopyCheckBox.Checked != oldSetting
-                    || shadowCopyPathTextBox.Text != oldPath;
+                return enableShadowCopyCheckBox.Checked != oldShadowCopyFiles
+                    || shadowCopyPathTextBox.Text != oldShadowCopyPath
+                    || principalPolicyCheckBox.Checked != oldSetPrincipalPolicy
+                    || principalPolicyListBox.SelectedIndex != (int)oldPrincipalPolicy;
 
 			}
 		}
@@ -179,6 +265,11 @@ namespace NUnit.Gui.SettingsPages
         {
             shadowCopyPathTextBox.Enabled = enableShadowCopyCheckBox.Checked;
         }
+
+        private void principalPolicyCheckBox_CheckedChanged(object sender, EventArgs e)
+        {
+            principalPolicyListBox.Enabled = principalPolicyCheckBox.Checked;
+        }
 	}
 }
 
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
index e8a6a9f..3261136 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
@@ -52,75 +52,80 @@ namespace NUnit.Gui.SettingsPages
 		/// </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();
-			this.reloadOnRunCheckBox = new System.Windows.Forms.CheckBox();
-			this.reloadOnChangeCheckBox = new System.Windows.Forms.CheckBox();
-			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(112, 16);
-			this.label1.TabIndex = 7;
-			this.label1.Text = "Assembly Reload";
-			// 
-			// 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(120, 0);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(344, 8);
-			this.groupBox1.TabIndex = 6;
-			this.groupBox1.TabStop = false;
-			// 
-			// rerunOnChangeCheckBox
-			// 
-			this.rerunOnChangeCheckBox.Enabled = false;
-			this.helpProvider1.SetHelpString(this.rerunOnChangeCheckBox, "If checked, the last tests run will be re-run automatically whenever the assembly" +
-				" changes.");
-			this.rerunOnChangeCheckBox.Location = new System.Drawing.Point(48, 88);
-			this.rerunOnChangeCheckBox.Name = "rerunOnChangeCheckBox";
-			this.helpProvider1.SetShowHelp(this.rerunOnChangeCheckBox, true);
-			this.rerunOnChangeCheckBox.Size = new System.Drawing.Size(200, 24);
-			this.rerunOnChangeCheckBox.TabIndex = 13;
-			this.rerunOnChangeCheckBox.Text = "Re-run last tests run";
-			// 
-			// reloadOnRunCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.reloadOnRunCheckBox, "If checked, the assembly is reloaded before each run");
-			this.reloadOnRunCheckBox.Location = new System.Drawing.Point(24, 24);
-			this.reloadOnRunCheckBox.Name = "reloadOnRunCheckBox";
-			this.helpProvider1.SetShowHelp(this.reloadOnRunCheckBox, true);
-			this.reloadOnRunCheckBox.Size = new System.Drawing.Size(237, 23);
-			this.reloadOnRunCheckBox.TabIndex = 11;
-			this.reloadOnRunCheckBox.Text = "Reload before each test run";
-			// 
-			// reloadOnChangeCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.reloadOnChangeCheckBox, "If checked, the assembly is reloaded whenever it changes. Changes to this setting" +
-				" do not take effect until the next time an assembly is loaded.");
-			this.reloadOnChangeCheckBox.Location = new System.Drawing.Point(24, 56);
-			this.reloadOnChangeCheckBox.Name = "reloadOnChangeCheckBox";
-			this.helpProvider1.SetShowHelp(this.reloadOnChangeCheckBox, true);
-			this.reloadOnChangeCheckBox.Size = new System.Drawing.Size(245, 25);
-			this.reloadOnChangeCheckBox.TabIndex = 12;
-			this.reloadOnChangeCheckBox.Text = "Reload when test assembly changes";
-			this.reloadOnChangeCheckBox.CheckedChanged += new System.EventHandler(this.reloadOnChangeCheckBox_CheckedChanged);
-			// 
-			// AssemblyReloadSettingsPage
-			// 
-			this.Controls.Add(this.rerunOnChangeCheckBox);
-			this.Controls.Add(this.reloadOnRunCheckBox);
-			this.Controls.Add(this.reloadOnChangeCheckBox);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.groupBox1);
-			this.Name = "AssemblyReloadSettingsPage";
-			this.ResumeLayout(false);
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1 = 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.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(8, 4);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(88, 13);
+            this.label1.TabIndex = 7;
+            this.label1.Text = "Assembly Reload";
+            // 
+            // 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(181, 4);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(259, 8);
+            this.groupBox1.TabIndex = 6;
+            this.groupBox1.TabStop = false;
+            // 
+            // rerunOnChangeCheckBox
+            // 
+            this.rerunOnChangeCheckBox.AutoSize = true;
+            this.rerunOnChangeCheckBox.Enabled = false;
+            this.helpProvider1.SetHelpString(this.rerunOnChangeCheckBox, "If checked, the last tests run will be re-run automatically whenever the assembly" +
+                    " changes.");
+            this.rerunOnChangeCheckBox.Location = new System.Drawing.Point(48, 96);
+            this.rerunOnChangeCheckBox.Name = "rerunOnChangeCheckBox";
+            this.helpProvider1.SetShowHelp(this.rerunOnChangeCheckBox, true);
+            this.rerunOnChangeCheckBox.Size = new System.Drawing.Size(120, 17);
+            this.rerunOnChangeCheckBox.TabIndex = 13;
+            this.rerunOnChangeCheckBox.Text = "Re-run last tests run";
+            // 
+            // reloadOnRunCheckBox
+            // 
+            this.reloadOnRunCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.reloadOnRunCheckBox, "If checked, the assembly is reloaded before each run");
+            this.reloadOnRunCheckBox.Location = new System.Drawing.Point(24, 32);
+            this.reloadOnRunCheckBox.Name = "reloadOnRunCheckBox";
+            this.helpProvider1.SetShowHelp(this.reloadOnRunCheckBox, true);
+            this.reloadOnRunCheckBox.Size = new System.Drawing.Size(158, 17);
+            this.reloadOnRunCheckBox.TabIndex = 11;
+            this.reloadOnRunCheckBox.Text = "Reload before each test run";
+            // 
+            // reloadOnChangeCheckBox
+            // 
+            this.reloadOnChangeCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.reloadOnChangeCheckBox, "If checked, the assembly is reloaded whenever it changes. Changes to this setting" +
+                    " do not take effect until the next time an assembly is loaded.");
+            this.reloadOnChangeCheckBox.Location = new System.Drawing.Point(24, 64);
+            this.reloadOnChangeCheckBox.Name = "reloadOnChangeCheckBox";
+            this.helpProvider1.SetShowHelp(this.reloadOnChangeCheckBox, true);
+            this.reloadOnChangeCheckBox.Size = new System.Drawing.Size(199, 17);
+            this.reloadOnChangeCheckBox.TabIndex = 12;
+            this.reloadOnChangeCheckBox.Text = "Reload when test assembly changes";
+            this.reloadOnChangeCheckBox.CheckedChanged += new System.EventHandler(this.reloadOnChangeCheckBox_CheckedChanged);
+            // 
+            // AssemblyReloadSettingsPage
+            // 
+            this.Controls.Add(this.rerunOnChangeCheckBox);
+            this.Controls.Add(this.reloadOnRunCheckBox);
+            this.Controls.Add(this.reloadOnChangeCheckBox);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.groupBox1);
+            this.Name = "AssemblyReloadSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
 
 		}
 		#endregion
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx
index 14c54bb..61bb827 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.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="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="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="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.Name">
-    <value>AssemblyReloadSettingsPage</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>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
index 6191533..bd9d354 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
@@ -75,9 +75,10 @@ namespace NUnit.Gui.SettingsPages
             // 
             // label1
             // 
+            this.label1.AutoSize = true;
             this.label1.Location = new System.Drawing.Point(8, 0);
             this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(88, 16);
+            this.label1.Size = new System.Drawing.Size(60, 13);
             this.label1.TabIndex = 7;
             this.label1.Text = "Gui Display";
             // 
@@ -85,35 +86,36 @@ namespace NUnit.Gui.SettingsPages
             // 
             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.Location = new System.Drawing.Point(135, 0);
             this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(368, 8);
+            this.groupBox1.Size = new System.Drawing.Size(313, 8);
             this.groupBox1.TabIndex = 6;
             this.groupBox1.TabStop = false;
             // 
             // label2
             // 
+            this.label2.AutoSize = true;
             this.label2.Location = new System.Drawing.Point(8, 96);
             this.label2.Name = "label2";
-            this.label2.Size = new System.Drawing.Size(96, 16);
+            this.label2.Size = new System.Drawing.Size(66, 13);
             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.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox2.Location = new System.Drawing.Point(135, 96);
             this.groupBox2.Name = "groupBox2";
-            this.groupBox2.Size = new System.Drawing.Size(360, 8);
+            this.groupBox2.Size = new System.Drawing.Size(313, 8);
             this.groupBox2.TabIndex = 8;
             this.groupBox2.TabStop = false;
             // 
             // label3
             // 
+            this.label3.AutoSize = true;
             this.label3.Location = new System.Drawing.Point(152, 120);
             this.label3.Name = "label3";
-            this.label3.Size = new System.Drawing.Size(96, 24);
+            this.label3.Size = new System.Drawing.Size(65, 13);
             this.label3.TabIndex = 30;
             this.label3.Text = "files in menu";
             // 
@@ -123,47 +125,51 @@ namespace NUnit.Gui.SettingsPages
             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.Size = new System.Drawing.Size(40, 20);
             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.AutoSize = true;
             this.label4.Location = new System.Drawing.Point(32, 120);
             this.label4.Name = "label4";
-            this.label4.Size = new System.Drawing.Size(55, 16);
+            this.label4.Size = new System.Drawing.Size(23, 13);
             this.label4.TabIndex = 28;
             this.label4.Text = "List";
             // 
             // loadLastProjectCheckBox
             // 
+            this.loadLastProjectCheckBox.AutoSize = true;
             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.Size = new System.Drawing.Size(193, 17);
             this.loadLastProjectCheckBox.TabIndex = 31;
             this.loadLastProjectCheckBox.Text = "Load most recent project at startup.";
             // 
             // fullGuiRadioButton
             // 
+            this.fullGuiRadioButton.AutoSize = true;
             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.Size = new System.Drawing.Size(215, 17);
             this.fullGuiRadioButton.TabIndex = 32;
             this.fullGuiRadioButton.Text = "Full Gui with progress bar and result tabs";
             // 
             // miniGuiRadioButton
             // 
+            this.miniGuiRadioButton.AutoSize = true;
             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.Size = new System.Drawing.Size(148, 17);
             this.miniGuiRadioButton.TabIndex = 33;
             this.miniGuiRadioButton.Text = "Mini Gui showing tree only";
             // 
@@ -172,7 +178,7 @@ namespace NUnit.Gui.SettingsPages
             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.Size = new System.Drawing.Size(185, 17);
             this.checkFilesExistCheckBox.TabIndex = 34;
             this.checkFilesExistCheckBox.Text = "Check that files exist before listing";
             this.checkFilesExistCheckBox.UseVisualStyleBackColor = true;
@@ -254,7 +260,7 @@ namespace NUnit.Gui.SettingsPages
 				if ( errmsg != null )
 				{
 					recentFilesCountTextBox.SelectAll();
-					UserMessage.DisplayFailure( errmsg );
+                    MessageDisplay.Error(errmsg);
 					e.Cancel = true;
 				}
 			}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
index e3d05b0..31898ad 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
@@ -33,16 +33,15 @@
             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.logDirectoryLabel = new CP.Windows.Forms.ExpandingLabel();
             this.SuspendLayout();
             // 
             // label3
             // 
+            this.label3.AutoSize = true;
             this.label3.Location = new System.Drawing.Point(9, 5);
             this.label3.Name = "label3";
-            this.label3.Size = new System.Drawing.Size(88, 16);
+            this.label3.Size = new System.Drawing.Size(73, 13);
             this.label3.TabIndex = 14;
             this.label3.Text = "Internal Trace";
             // 
@@ -50,9 +49,9 @@
             // 
             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.Location = new System.Drawing.Point(158, 5);
             this.groupBox3.Name = "groupBox3";
-            this.groupBox3.Size = new System.Drawing.Size(344, 8);
+            this.groupBox3.Size = new System.Drawing.Size(283, 8);
             this.groupBox3.TabIndex = 13;
             this.groupBox3.TabStop = false;
             // 
@@ -75,15 +74,14 @@
             "Warning",
             "Info",
             "Verbose"});
-            this.traceLevelComboBox.Location = new System.Drawing.Point(105, 43);
+            this.traceLevelComboBox.Location = new System.Drawing.Point(134, 43);
             this.traceLevelComboBox.Name = "traceLevelComboBox";
-            this.traceLevelComboBox.Size = new System.Drawing.Size(61, 21);
+            this.traceLevelComboBox.Size = new System.Drawing.Size(89, 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);
@@ -92,35 +90,13 @@
             // 
             // logDirectoryLabel
             // 
-            this.logDirectoryLabel.AutoSize = true;
-            this.logDirectoryLabel.Location = new System.Drawing.Point(102, 87);
+            this.logDirectoryLabel.Location = new System.Drawing.Point(131, 87);
             this.logDirectoryLabel.Name = "logDirectoryLabel";
-            this.logDirectoryLabel.Size = new System.Drawing.Size(0, 13);
+            this.logDirectoryLabel.Size = new System.Drawing.Size(310, 22);
             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);
@@ -140,8 +116,6 @@
         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;
+        private CP.Windows.Forms.ExpandingLabel logDirectoryLabel;
     }
 }
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
index 7a126d0..1c40099 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
@@ -5,6 +5,7 @@
 // ****************************************************************
 
 using System;
+using System.IO;
 using NUnit.Core;
 
 namespace NUnit.Gui.SettingsPages
@@ -19,14 +20,14 @@ namespace NUnit.Gui.SettingsPages
         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");
+            logDirectoryLabel.Text = NUnitConfiguration.LogDirectory;
         }
 
         public override void ApplySettings()
         {
-           settings.SaveSetting("Options.InternalTraceLevel", (InternalTraceLevel)traceLevelComboBox.SelectedIndex);
+            InternalTraceLevel level = (InternalTraceLevel)traceLevelComboBox.SelectedIndex;
+            settings.SaveSetting("Options.InternalTraceLevel", level);
+            InternalTrace.Level = level;
         }
     }
 }
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs
new file mode 100644
index 0000000..0888312
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs
@@ -0,0 +1,126 @@
+namespace NUnit.Gui.SettingsPages
+{
+    partial class ProjectEditorSettingsPage
+    {
+        /// <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 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()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProjectEditorSettingsPage));
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.editorPathTextBox = new System.Windows.Forms.TextBox();
+            this.editorPathBrowseButton = new System.Windows.Forms.Button();
+            this.useNUnitEditorRadioButton = new System.Windows.Forms.RadioButton();
+            this.useOtherEditorRadioButton = new System.Windows.Forms.RadioButton();
+            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(112, 10);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(333, 8);
+            this.groupBox1.TabIndex = 1;
+            this.groupBox1.TabStop = false;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(2, 10);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(88, 16);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Project Editor";
+            // 
+            // editorPathTextBox
+            // 
+            this.editorPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.editorPathTextBox.Location = new System.Drawing.Point(112, 64);
+            this.editorPathTextBox.Name = "editorPathTextBox";
+            this.editorPathTextBox.Size = new System.Drawing.Size(298, 20);
+            this.editorPathTextBox.TabIndex = 4;
+            this.editorPathTextBox.TextChanged += new System.EventHandler(this.editorPathTextBox_TextChanged);
+            // 
+            // editorPathBrowseButton
+            // 
+            this.editorPathBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.editorPathBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("editorPathBrowseButton.Image")));
+            this.editorPathBrowseButton.Location = new System.Drawing.Point(418, 61);
+            this.editorPathBrowseButton.Margin = new System.Windows.Forms.Padding(2);
+            this.editorPathBrowseButton.Name = "editorPathBrowseButton";
+            this.editorPathBrowseButton.Size = new System.Drawing.Size(27, 26);
+            this.editorPathBrowseButton.TabIndex = 5;
+            this.editorPathBrowseButton.Click += new System.EventHandler(this.editorPathBrowseButton_Click);
+            // 
+            // useNUnitEditorRadioButton
+            // 
+            this.useNUnitEditorRadioButton.AutoSize = true;
+            this.useNUnitEditorRadioButton.Location = new System.Drawing.Point(20, 39);
+            this.useNUnitEditorRadioButton.Name = "useNUnitEditorRadioButton";
+            this.useNUnitEditorRadioButton.Size = new System.Drawing.Size(140, 17);
+            this.useNUnitEditorRadioButton.TabIndex = 2;
+            this.useNUnitEditorRadioButton.TabStop = true;
+            this.useNUnitEditorRadioButton.Text = "Use NUnit Project Editor";
+            this.useNUnitEditorRadioButton.UseVisualStyleBackColor = true;
+            // 
+            // useOtherEditorRadioButton
+            // 
+            this.useOtherEditorRadioButton.AutoSize = true;
+            this.useOtherEditorRadioButton.Location = new System.Drawing.Point(20, 66);
+            this.useOtherEditorRadioButton.Name = "useOtherEditorRadioButton";
+            this.useOtherEditorRadioButton.Size = new System.Drawing.Size(89, 17);
+            this.useOtherEditorRadioButton.TabIndex = 3;
+            this.useOtherEditorRadioButton.TabStop = true;
+            this.useOtherEditorRadioButton.Text = "Use Program:";
+            this.useOtherEditorRadioButton.UseVisualStyleBackColor = true;
+            // 
+            // ProjectEditorSettingsPage
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.useOtherEditorRadioButton);
+            this.Controls.Add(this.useNUnitEditorRadioButton);
+            this.Controls.Add(this.editorPathBrowseButton);
+            this.Controls.Add(this.editorPathTextBox);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.label1);
+            this.Name = "ProjectEditorSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox editorPathTextBox;
+        private System.Windows.Forms.Button editorPathBrowseButton;
+        private System.Windows.Forms.RadioButton useNUnitEditorRadioButton;
+        private System.Windows.Forms.RadioButton useOtherEditorRadioButton;
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.cs
new file mode 100644
index 0000000..5c0bb6c
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.cs
@@ -0,0 +1,72 @@
+// ****************************************************************
+// Copyright 2012, 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.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using NUnit.UiKit;
+
+namespace NUnit.Gui.SettingsPages
+{
+    public partial class ProjectEditorSettingsPage : SettingsPage
+    {
+        private static readonly string EDITOR_PATH_SETTING = "Options.ProjectEditor.EditorPath";
+
+        public ProjectEditorSettingsPage(string key) : base(key)
+        {
+            InitializeComponent();
+        }
+
+        public override void LoadSettings()
+        {
+            string editorPath = (string)settings.GetSetting(EDITOR_PATH_SETTING);
+
+            if (editorPath != null)
+            {
+                useOtherEditorRadioButton.Checked = true;
+                editorPathTextBox.Text = editorPath;
+            }
+            else
+            {
+                useNUnitEditorRadioButton.Checked = true;
+                editorPathTextBox.Text = "";
+            }
+        }
+
+        public override void ApplySettings()
+        {
+            if (useNUnitEditorRadioButton.Checked)
+                settings.RemoveSetting(EDITOR_PATH_SETTING);
+            else
+                settings.SaveSetting(EDITOR_PATH_SETTING, editorPathTextBox.Text);
+        }
+
+        private void editorPathTextBox_TextChanged(object sender, EventArgs e)
+        {
+            if (editorPathTextBox.TextLength == 0)
+                useNUnitEditorRadioButton.Checked = true;
+            else
+                useOtherEditorRadioButton.Checked = true;
+        }
+
+        private void editorPathBrowseButton_Click(object sender, EventArgs e)
+        {
+			OpenFileDialog dlg = new OpenFileDialog();
+			if ( Site != null ) dlg.Site = Site;
+			dlg.Title = "Select Project Editor";
+
+			dlg.Filter = "Executable Files (*.exe)|*.exe";
+			dlg.FilterIndex = 1;
+			dlg.FileName = "";
+
+			if ( dlg.ShowDialog( this ) == DialogResult.OK ) 
+				editorPathTextBox.Text = dlg.FileName;
+        }
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.resx
new file mode 100644
index 0000000..c33f6d4
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.resx
@@ -0,0 +1,128 @@
+<?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.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="editorPathBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhCgAKAIMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
+        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAPACwAAAAACgAKAAAIHgAfCBxIsKDBgwgJAgAgcGHDhQwf
+        OJQYMaHFiwgDAgA7
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.Designer.cs b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.Designer.cs
new file mode 100644
index 0000000..d137426
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.Designer.cs
@@ -0,0 +1,88 @@
+namespace NUnit.Gui.SettingsPages
+{
+    partial class RuntimeSelectionSettingsPage
+    {
+        /// <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.runtimeSelectionCheckBox = new System.Windows.Forms.CheckBox();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.SuspendLayout();
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(9, 5);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(93, 13);
+            this.label3.TabIndex = 14;
+            this.label3.Text = "Runtime Selection";
+            // 
+            // 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(169, 5);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(280, 8);
+            this.groupBox3.TabIndex = 13;
+            this.groupBox3.TabStop = false;
+            // 
+            // runtimeSelectionCheckBox
+            // 
+            this.helpProvider1.SetHelpString(this.runtimeSelectionCheckBox, "If checked and no specific runtime is requested, NUnit examines each assembly and" +
+                    " attempts to load it using the runtime version for which it was built. If not ch" +
+                    "ecked, the current runtime is used.");
+            this.runtimeSelectionCheckBox.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            this.runtimeSelectionCheckBox.Location = new System.Drawing.Point(35, 28);
+            this.runtimeSelectionCheckBox.Name = "runtimeSelectionCheckBox";
+            this.helpProvider1.SetShowHelp(this.runtimeSelectionCheckBox, true);
+            this.runtimeSelectionCheckBox.Size = new System.Drawing.Size(372, 48);
+            this.runtimeSelectionCheckBox.TabIndex = 15;
+            this.runtimeSelectionCheckBox.Text = "Select default runtime version based on target framework of test assembly";
+            this.runtimeSelectionCheckBox.UseVisualStyleBackColor = true;
+            // 
+            // RuntimeSelectionSettingsPage
+            // 
+            this.Controls.Add(this.runtimeSelectionCheckBox);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.groupBox3);
+            this.Name = "RuntimeSelectionSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.CheckBox runtimeSelectionCheckBox;
+        private System.Windows.Forms.HelpProvider helpProvider1;
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.cs
new file mode 100644
index 0000000..196a668
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.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 RuntimeSelectionSettingsPage : NUnit.UiKit.SettingsPage
+    {
+        private static readonly string RUNTIME_SELECTION_ENABLED =
+            "Options.TestLoader.RuntimeSelectionEnabled";
+
+        public RuntimeSelectionSettingsPage(string key) : base(key)
+        {
+            InitializeComponent();
+        }
+
+        public override void LoadSettings()
+        {
+            runtimeSelectionCheckBox.Checked = settings.GetSetting(RUNTIME_SELECTION_ENABLED, true);
+        }
+
+        public override void ApplySettings()
+        {
+            settings.SaveSetting(RUNTIME_SELECTION_ENABLED, runtimeSelectionCheckBox.Checked);
+        }
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.resx
similarity index 100%
copy from src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
copy to src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.resx
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
index 1cebd80..448b10a 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
@@ -58,135 +58,144 @@ namespace NUnit.Gui.SettingsPages
 		/// </summary>
 		private void InitializeComponent()
 		{
-			this.mergeAssembliesCheckBox = new System.Windows.Forms.CheckBox();
-			this.singleDomainRadioButton = new System.Windows.Forms.RadioButton();
-			this.multiDomainRadioButton = 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();
-			// 
-			// 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, 208);
-			this.mergeAssembliesCheckBox.Name = "mergeAssembliesCheckBox";
-			this.helpProvider1.SetShowHelp(this.mergeAssembliesCheckBox, true);
-			this.mergeAssembliesCheckBox.Size = new System.Drawing.Size(224, 24);
-			this.mergeAssembliesCheckBox.TabIndex = 10;
-			this.mergeAssembliesCheckBox.Text = "Merge tests across assemblies";
-			// 
-			// singleDomainRadioButton
-			// 
-			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, 176);
-			this.singleDomainRadioButton.Name = "singleDomainRadioButton";
-			this.helpProvider1.SetShowHelp(this.singleDomainRadioButton, true);
-			this.singleDomainRadioButton.Size = new System.Drawing.Size(272, 24);
-			this.singleDomainRadioButton.TabIndex = 9;
-			this.singleDomainRadioButton.TabStop = true;
-			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, 144);
-			this.multiDomainRadioButton.Name = "multiDomainRadioButton";
-			this.helpProvider1.SetShowHelp(this.multiDomainRadioButton, true);
-			this.multiDomainRadioButton.Size = new System.Drawing.Size(302, 24);
-			this.multiDomainRadioButton.TabIndex = 8;
-			this.multiDomainRadioButton.Text = "Use a separate AppDomain per Assembly";
-			this.multiDomainRadioButton.Click += new System.EventHandler(this.toggleMultiDomain);
-			// 
-			// 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.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.Name = "TestLoaderSettingsPage";
-			this.Size = new System.Drawing.Size(456, 341);
-			this.ResumeLayout(false);
+            this.mergeAssembliesCheckBox = new System.Windows.Forms.CheckBox();
+            this.singleDomainRadioButton = new System.Windows.Forms.RadioButton();
+            this.multiDomainRadioButton = 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();
+            // 
+            // mergeAssembliesCheckBox
+            // 
+            this.mergeAssembliesCheckBox.AutoSize = true;
+            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, 221);
+            this.mergeAssembliesCheckBox.Name = "mergeAssembliesCheckBox";
+            this.helpProvider1.SetShowHelp(this.mergeAssembliesCheckBox, true);
+            this.mergeAssembliesCheckBox.Size = new System.Drawing.Size(169, 17);
+            this.mergeAssembliesCheckBox.TabIndex = 10;
+            this.mergeAssembliesCheckBox.Text = "Merge tests across assemblies";
+            // 
+            // singleDomainRadioButton
+            // 
+            this.singleDomainRadioButton.AutoCheck = false;
+            this.singleDomainRadioButton.AutoSize = true;
+            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, 190);
+            this.singleDomainRadioButton.Name = "singleDomainRadioButton";
+            this.helpProvider1.SetShowHelp(this.singleDomainRadioButton, true);
+            this.singleDomainRadioButton.Size = new System.Drawing.Size(194, 17);
+            this.singleDomainRadioButton.TabIndex = 9;
+            this.singleDomainRadioButton.TabStop = true;
+            this.singleDomainRadioButton.Text = "Use a single AppDomain for all tests";
+            this.singleDomainRadioButton.Click += new System.EventHandler(this.toggleMultiDomain);
+            // 
+            // multiDomainRadioButton
+            // 
+            this.multiDomainRadioButton.AutoCheck = false;
+            this.multiDomainRadioButton.AutoSize = true;
+            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, 160);
+            this.multiDomainRadioButton.Name = "multiDomainRadioButton";
+            this.helpProvider1.SetShowHelp(this.multiDomainRadioButton, true);
+            this.multiDomainRadioButton.Size = new System.Drawing.Size(220, 17);
+            this.multiDomainRadioButton.TabIndex = 8;
+            this.multiDomainRadioButton.Text = "Use a separate AppDomain per Assembly";
+            this.multiDomainRadioButton.Click += new System.EventHandler(this.toggleMultiDomain);
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(16, 8);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(114, 13);
+            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(199, 8);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(253, 8);
+            this.groupBox3.TabIndex = 34;
+            this.groupBox3.TabStop = false;
+            // 
+            // multiProcessRadioButton
+            // 
+            this.multiProcessRadioButton.AutoSize = true;
+            this.multiProcessRadioButton.Location = new System.Drawing.Point(32, 99);
+            this.multiProcessRadioButton.Name = "multiProcessRadioButton";
+            this.multiProcessRadioButton.Size = new System.Drawing.Size(239, 17);
+            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.AutoSize = true;
+            this.separateProcessRadioButton.Location = new System.Drawing.Point(32, 66);
+            this.separateProcessRadioButton.Name = "separateProcessRadioButton";
+            this.separateProcessRadioButton.Size = new System.Drawing.Size(204, 17);
+            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.AutoSize = true;
+            this.sameProcessRadioButton.Checked = true;
+            this.sameProcessRadioButton.Location = new System.Drawing.Point(32, 33);
+            this.sameProcessRadioButton.Name = "sameProcessRadioButton";
+            this.sameProcessRadioButton.Size = new System.Drawing.Size(205, 17);
+            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.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(16, 136);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(114, 13);
+            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(199, 136);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(253, 8);
+            this.groupBox2.TabIndex = 39;
+            this.groupBox2.TabStop = false;
+            // 
+            // TestLoaderSettingsPage
+            // 
+            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.Name = "TestLoaderSettingsPage";
+            this.Size = new System.Drawing.Size(456, 341);
+            this.ResumeLayout(false);
+            this.PerformLayout();
 
 		}
 		#endregion
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
index 9c4e8c8..7e44abc 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.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,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="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="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="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="multiProcessRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="multiProcessRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="multiProcessRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="separateProcessRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="separateProcessRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="separateProcessRadioButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="sameProcessRadioButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="sameProcessRadioButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="sameProcessRadioButton.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="$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>TestLoaderSettingsPage</value>
-  </data>
+  </metadata>
 </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 93c7710..6cc5f8f 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
@@ -69,62 +69,67 @@ namespace NUnit.Gui.SettingsPages
             // 
             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.Location = new System.Drawing.Point(149, 0);
             this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(376, 8);
+            this.groupBox1.Size = new System.Drawing.Size(307, 8);
             this.groupBox1.TabIndex = 8;
             this.groupBox1.TabStop = false;
             // 
             // label1
             // 
+            this.label1.AutoSize = true;
             this.label1.Location = new System.Drawing.Point(8, 0);
             this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(88, 16);
+            this.label1.Size = new System.Drawing.Size(56, 13);
             this.label1.TabIndex = 9;
             this.label1.Text = "Errors Tab";
             // 
             // errorsTabCheckBox
             // 
+            this.errorsTabCheckBox.AutoSize = true;
             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.Size = new System.Drawing.Size(172, 17);
             this.errorsTabCheckBox.TabIndex = 10;
             this.errorsTabCheckBox.Text = "Display Errors and Failures Tab";
             // 
             // failureToolTips
             // 
+            this.failureToolTips.AutoSize = true;
             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.Size = new System.Drawing.Size(137, 17);
             this.failureToolTips.TabIndex = 11;
             this.failureToolTips.Text = "Enable Failure ToolTips";
             // 
             // enableWordWrap
             // 
+            this.enableWordWrap.AutoSize = true;
             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.Size = new System.Drawing.Size(117, 17);
             this.enableWordWrap.TabIndex = 12;
             this.enableWordWrap.Text = "Enable Word Wrap";
             // 
             // notRunTabCheckBox
             // 
+            this.notRunTabCheckBox.AutoSize = true;
             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.Size = new System.Drawing.Size(154, 17);
             this.notRunTabCheckBox.TabIndex = 13;
             this.notRunTabCheckBox.Text = "Display Tests Not Run Tab";
             // 
@@ -132,17 +137,18 @@ namespace NUnit.Gui.SettingsPages
             // 
             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.Location = new System.Drawing.Point(149, 128);
             this.groupBox2.Name = "groupBox2";
-            this.groupBox2.Size = new System.Drawing.Size(368, 8);
+            this.groupBox2.Size = new System.Drawing.Size(307, 8);
             this.groupBox2.TabIndex = 14;
             this.groupBox2.TabStop = false;
             // 
             // label2
             // 
+            this.label2.AutoSize = true;
             this.label2.Location = new System.Drawing.Point(8, 128);
             this.label2.Name = "label2";
-            this.label2.Size = new System.Drawing.Size(88, 16);
+            this.label2.Size = new System.Drawing.Size(69, 13);
             this.label2.TabIndex = 15;
             this.label2.Text = "Not Run Tab";
             // 
@@ -158,6 +164,7 @@ namespace NUnit.Gui.SettingsPages
             this.Controls.Add(this.label1);
             this.Name = "TestResultSettingsPage";
             this.ResumeLayout(false);
+            this.PerformLayout();
 
 		}
 		#endregion
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
index 5252dd5..2e8e00d 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
@@ -7,8 +7,11 @@ using System;
 using System.Collections;
 using System.ComponentModel;
 using System.Drawing;
+using System.IO;
+using System.Reflection;
 using System.Windows.Forms;
 using NUnit.UiKit;
+using NUnit.Util;
 
 namespace NUnit.Gui.SettingsPages
 {
@@ -25,8 +28,18 @@ namespace NUnit.Gui.SettingsPages
 		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.Windows.Forms.GroupBox groupBox2;
+        private Label label6;
+        private PictureBox successImage;
+        private PictureBox failureImage;
+        private PictureBox ignoredImage;
+        private PictureBox inconclusiveImage;
+        private PictureBox skippedImage;
 		private System.ComponentModel.IContainer components = null;
+        private Label label4;
+        private ListBox imageSetListBox;
+
+        private static string treeImageDir = PathUtils.Combine(Assembly.GetExecutingAssembly(), "Images", "Tree");
 
 		public TreeSettingsPage(string key) : base(key)
 		{
@@ -58,154 +71,267 @@ 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.initialDisplayComboBox = new System.Windows.Forms.ComboBox();
-			this.clearResultsCheckBox = new System.Windows.Forms.CheckBox();
-			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
-			// 
-			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(72, 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 = "Tree View";
-			// 
-			// label2
-			// 
-			this.label2.Location = new System.Drawing.Point(32, 24);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(144, 24);
-			this.label2.TabIndex = 32;
-			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 = 13;
-			this.initialDisplayComboBox.Items.AddRange(new object[] {
-																		"Auto",
-																		"Expand",
-																		"Collapse",
-																		"HideTests"});
-			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, 21);
-			this.initialDisplayComboBox.TabIndex = 33;
-			// 
-			// clearResultsCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.clearResultsCheckBox, "If checked, any prior results are cleared when reloading");
-			this.clearResultsCheckBox.Location = new System.Drawing.Point(32, 56);
-			this.clearResultsCheckBox.Name = "clearResultsCheckBox";
-			this.helpProvider1.SetShowHelp(this.clearResultsCheckBox, true);
-			this.clearResultsCheckBox.Size = new System.Drawing.Size(232, 24);
-			this.clearResultsCheckBox.TabIndex = 34;
-			this.clearResultsCheckBox.Text = "Clear results when reloading.";
-			// 
-			// saveVisualStateCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.saveVisualStateCheckBox, "If checked, the visual state of the project is saved on exit. This includes selec" +
-				"ted tests, categories and the state of the tree itself.");
-			this.saveVisualStateCheckBox.Location = new System.Drawing.Point(32, 88);
-			this.saveVisualStateCheckBox.Name = "saveVisualStateCheckBox";
-			this.helpProvider1.SetShowHelp(this.saveVisualStateCheckBox, true);
-			this.saveVisualStateCheckBox.Size = new System.Drawing.Size(248, 24);
-			this.saveVisualStateCheckBox.TabIndex = 35;
-			this.saveVisualStateCheckBox.Text = "Save Visual State of each project";
-			// 
-			// showCheckBoxesCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.showCheckBoxesCheckBox, "If selected, the tree displays checkboxes for use in selecting multiple tests.");
-			this.showCheckBoxesCheckBox.Location = new System.Drawing.Point(32, 120);
-			this.showCheckBoxesCheckBox.Name = "showCheckBoxesCheckBox";
-			this.helpProvider1.SetShowHelp(this.showCheckBoxesCheckBox, true);
-			this.showCheckBoxesCheckBox.Size = new System.Drawing.Size(264, 24);
-			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);
-			this.Controls.Add(this.clearResultsCheckBox);
-			this.Controls.Add(this.saveVisualStateCheckBox);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.label1);
-			this.Name = "TreeSettingsPage";
-			this.ResumeLayout(false);
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TreeSettingsPage));
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = 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.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.label6 = new System.Windows.Forms.Label();
+            this.successImage = new System.Windows.Forms.PictureBox();
+            this.failureImage = new System.Windows.Forms.PictureBox();
+            this.ignoredImage = new System.Windows.Forms.PictureBox();
+            this.inconclusiveImage = new System.Windows.Forms.PictureBox();
+            this.skippedImage = new System.Windows.Forms.PictureBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.imageSetListBox = new System.Windows.Forms.ListBox();
+            ((System.ComponentModel.ISupportInitialize)(this.successImage)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.failureImage)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.ignoredImage)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.inconclusiveImage)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.skippedImage)).BeginInit();
+            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(144, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(304, 8);
+            this.groupBox1.TabIndex = 8;
+            this.groupBox1.TabStop = false;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(8, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(55, 13);
+            this.label1.TabIndex = 9;
+            this.label1.Text = "Tree View";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(32, 24);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(104, 13);
+            this.label2.TabIndex = 32;
+            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 = 13;
+            this.initialDisplayComboBox.Items.AddRange(new object[] {
+            "Auto",
+            "Expand",
+            "Collapse",
+            "HideTests"});
+            this.initialDisplayComboBox.Location = new System.Drawing.Point(236, 24);
+            this.initialDisplayComboBox.Name = "initialDisplayComboBox";
+            this.helpProvider1.SetShowHelp(this.initialDisplayComboBox, true);
+            this.initialDisplayComboBox.Size = new System.Drawing.Size(168, 21);
+            this.initialDisplayComboBox.TabIndex = 33;
+            // 
+            // clearResultsCheckBox
+            // 
+            this.clearResultsCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.clearResultsCheckBox, "If checked, any prior results are cleared when reloading");
+            this.clearResultsCheckBox.Location = new System.Drawing.Point(32, 129);
+            this.clearResultsCheckBox.Name = "clearResultsCheckBox";
+            this.helpProvider1.SetShowHelp(this.clearResultsCheckBox, true);
+            this.clearResultsCheckBox.Size = new System.Drawing.Size(161, 17);
+            this.clearResultsCheckBox.TabIndex = 34;
+            this.clearResultsCheckBox.Text = "Clear results when reloading.";
+            // 
+            // saveVisualStateCheckBox
+            // 
+            this.saveVisualStateCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.saveVisualStateCheckBox, "If checked, the visual state of the project is saved on exit. This includes selec" +
+                    "ted tests, categories and the state of the tree itself.");
+            this.saveVisualStateCheckBox.Location = new System.Drawing.Point(32, 155);
+            this.saveVisualStateCheckBox.Name = "saveVisualStateCheckBox";
+            this.helpProvider1.SetShowHelp(this.saveVisualStateCheckBox, true);
+            this.saveVisualStateCheckBox.Size = new System.Drawing.Size(184, 17);
+            this.saveVisualStateCheckBox.TabIndex = 35;
+            this.saveVisualStateCheckBox.Text = "Save Visual State of each project";
+            // 
+            // showCheckBoxesCheckBox
+            // 
+            this.showCheckBoxesCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.showCheckBoxesCheckBox, "If selected, the tree displays checkboxes for use in selecting multiple tests.");
+            this.showCheckBoxesCheckBox.Location = new System.Drawing.Point(32, 181);
+            this.showCheckBoxesCheckBox.Name = "showCheckBoxesCheckBox";
+            this.helpProvider1.SetShowHelp(this.showCheckBoxesCheckBox, true);
+            this.showCheckBoxesCheckBox.Size = new System.Drawing.Size(116, 17);
+            this.showCheckBoxesCheckBox.TabIndex = 36;
+            this.showCheckBoxesCheckBox.Text = "Show CheckBoxes";
+            // 
+            // flatTestList
+            // 
+            this.flatTestList.AutoCheck = false;
+            this.flatTestList.AutoSize = true;
+            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, 269);
+            this.flatTestList.Name = "flatTestList";
+            this.helpProvider1.SetShowHelp(this.flatTestList, true);
+            this.flatTestList.Size = new System.Drawing.Size(129, 17);
+            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.AutoSize = true;
+            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, 243);
+            this.autoNamespaceSuites.Name = "autoNamespaceSuites";
+            this.helpProvider1.SetShowHelp(this.autoNamespaceSuites, true);
+            this.autoNamespaceSuites.Size = new System.Drawing.Size(162, 17);
+            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.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(8, 218);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(74, 13);
+            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(144, 218);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(304, 8);
+            this.groupBox2.TabIndex = 37;
+            this.groupBox2.TabStop = false;
+            // 
+            // label6
+            // 
+            this.label6.BackColor = System.Drawing.SystemColors.Window;
+            this.label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.label6.Location = new System.Drawing.Point(66, 81);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(137, 36);
+            this.label6.TabIndex = 47;
+            // 
+            // successImage
+            // 
+            this.successImage.Image = ((System.Drawing.Image)(resources.GetObject("successImage.Image")));
+            this.successImage.Location = new System.Drawing.Point(78, 92);
+            this.successImage.Name = "successImage";
+            this.successImage.Size = new System.Drawing.Size(16, 16);
+            this.successImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.successImage.TabIndex = 48;
+            this.successImage.TabStop = false;
+            // 
+            // failureImage
+            // 
+            this.failureImage.Image = ((System.Drawing.Image)(resources.GetObject("failureImage.Image")));
+            this.failureImage.Location = new System.Drawing.Point(103, 92);
+            this.failureImage.Name = "failureImage";
+            this.failureImage.Size = new System.Drawing.Size(16, 16);
+            this.failureImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.failureImage.TabIndex = 49;
+            this.failureImage.TabStop = false;
+            // 
+            // ignoredImage
+            // 
+            this.ignoredImage.Image = ((System.Drawing.Image)(resources.GetObject("ignoredImage.Image")));
+            this.ignoredImage.Location = new System.Drawing.Point(128, 92);
+            this.ignoredImage.Name = "ignoredImage";
+            this.ignoredImage.Size = new System.Drawing.Size(16, 16);
+            this.ignoredImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.ignoredImage.TabIndex = 50;
+            this.ignoredImage.TabStop = false;
+            // 
+            // inconclusiveImage
+            // 
+            this.inconclusiveImage.Image = ((System.Drawing.Image)(resources.GetObject("inconclusiveImage.Image")));
+            this.inconclusiveImage.Location = new System.Drawing.Point(152, 92);
+            this.inconclusiveImage.Name = "inconclusiveImage";
+            this.inconclusiveImage.Size = new System.Drawing.Size(16, 16);
+            this.inconclusiveImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.inconclusiveImage.TabIndex = 51;
+            this.inconclusiveImage.TabStop = false;
+            // 
+            // skippedImage
+            // 
+            this.skippedImage.Image = ((System.Drawing.Image)(resources.GetObject("skippedImage.Image")));
+            this.skippedImage.Location = new System.Drawing.Point(177, 92);
+            this.skippedImage.Name = "skippedImage";
+            this.skippedImage.Size = new System.Drawing.Size(16, 16);
+            this.skippedImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.skippedImage.TabIndex = 52;
+            this.skippedImage.TabStop = false;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(32, 60);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(66, 13);
+            this.label4.TabIndex = 53;
+            this.label4.Text = "Tree Images";
+            // 
+            // imageSetListBox
+            // 
+            this.imageSetListBox.FormattingEnabled = true;
+            this.imageSetListBox.Location = new System.Drawing.Point(236, 61);
+            this.imageSetListBox.Name = "imageSetListBox";
+            this.imageSetListBox.Size = new System.Drawing.Size(168, 56);
+            this.imageSetListBox.TabIndex = 54;
+            this.imageSetListBox.SelectedIndexChanged += new System.EventHandler(this.imageSetListBox_SelectedIndexChanged);
+            // 
+            // TreeSettingsPage
+            // 
+            this.Controls.Add(this.imageSetListBox);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.skippedImage);
+            this.Controls.Add(this.inconclusiveImage);
+            this.Controls.Add(this.ignoredImage);
+            this.Controls.Add(this.failureImage);
+            this.Controls.Add(this.successImage);
+            this.Controls.Add(this.label6);
+            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);
+            this.Controls.Add(this.clearResultsCheckBox);
+            this.Controls.Add(this.saveVisualStateCheckBox);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.label1);
+            this.Name = "TreeSettingsPage";
+            ((System.ComponentModel.ISupportInitialize)(this.successImage)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.failureImage)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.ignoredImage)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.inconclusiveImage)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.skippedImage)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
 
 		}
 		#endregion
@@ -216,6 +342,16 @@ namespace NUnit.Gui.SettingsPages
 			clearResultsCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", true );
 			saveVisualStateCheckBox.Checked = settings.GetSetting( "Gui.TestTree.SaveVisualState", true );
 			showCheckBoxesCheckBox.Checked = settings.GetSetting( "Options.ShowCheckBoxes", false );
+
+            string[] altDirs = Directory.Exists(treeImageDir)
+                ? Directory.GetDirectories(treeImageDir)
+                : new string[0];
+
+            foreach (string altDir in altDirs)
+                imageSetListBox.Items.Add(Path.GetFileName(altDir));
+            string imageSet = settings.GetSetting("Gui.TestTree.AlternateImageSet", "Default");
+            if (imageSetListBox.Items.Contains(imageSet))
+                imageSetListBox.SelectedItem = imageSet;
 		
 			autoNamespaceSuites.Checked = settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true );
 			flatTestList.Checked = !autoNamespaceSuites.Checked;
@@ -227,6 +363,10 @@ namespace NUnit.Gui.SettingsPages
 			settings.SaveSetting( "Options.TestLoader.ClearResultsOnReload", clearResultsCheckBox.Checked );
 			settings.SaveSetting( "Gui.TestTree.SaveVisualState", saveVisualStateCheckBox.Checked );
 			settings.SaveSetting( "Options.ShowCheckBoxes", showCheckBoxesCheckBox.Checked );
+
+            if (imageSetListBox.SelectedIndex >= 0)
+                settings.SaveSetting("Gui.TestTree.AlternateImageSet", imageSetListBox.SelectedItem);
+
 			settings.SaveSetting( "Options.TestLoader.AutoNamespaceSuites", autoNamespaceSuites.Checked );
 		}
 
@@ -240,10 +380,43 @@ namespace NUnit.Gui.SettingsPages
 		{
 			get
 			{
-				return settings.GetSetting( "Options.TestLoader.AutoNamespaceSuites", true ) != autoNamespaceSuites.Checked;
+                return settings.GetSetting("Options.TestLoader.AutoNamespaceSuites", true) != autoNamespaceSuites.Checked;
 			}
 		}
 
+        private void imageSetListBox_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            string imageSet = imageSetListBox.SelectedItem as string;
+
+            if (imageSet != null)
+                DisplayImageSet(imageSet);
+        }
+
+        private void DisplayImageSet(string imageSet)
+        {
+            string imageSetDir = Path.Combine(treeImageDir, imageSet);
+
+            DisplayImage(imageSetDir, "Success", successImage);
+            DisplayImage(imageSetDir, "Failure", failureImage);
+            DisplayImage(imageSetDir, "Ignored", ignoredImage);
+            DisplayImage(imageSetDir, "Inconclusive", inconclusiveImage);
+            DisplayImage(imageSetDir, "Skipped", skippedImage);
+        }
+
+        private void DisplayImage(string imageDir, string filename, PictureBox box)
+        {
+            string[] extensions = { ".png", ".jpg" };
+
+            foreach (string ext in extensions)
+            {
+                string filePath = Path.Combine(imageDir, filename + ext);
+                if (File.Exists(filePath))
+                {
+                    box.Load(filePath);
+                    break;
+                }
+            }
+        }
 	}
 }
 
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
index 1058af9..ee1d62f 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.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,168 +109,106 @@
     <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="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="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.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>
-  <data name="saveVisualStateCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</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.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showCheckBoxesCheckBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="showCheckBoxesCheckBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="showCheckBoxesCheckBox.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="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>
-  <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>TreeSettingsPage</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>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="successImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
+        JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
+        MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QA
+        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
+        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
+        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
+        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
+        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDu9f8AEt3LePb2rGCKM4OANxNZ3gjxxfal4i1DT5wJdPglFtFM
+        33mmAJkBzjgfKOnPJyeyeNPA1zfXP2uzLiVXMttdQj54HIweO6noVPBFTeA/BUuj29jFLGY4LNM/MMGR
+        +ctgk4ySTjtmvDh9aWKbbbu9uiXfttp835HzcPryxjbbd3a32VG+/Z6WXzfZH//Z
+</value>
+  </data>
+  <data name="failureImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
+        JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
+        MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QA
+        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
+        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
+        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
+        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
+        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBvi7x9r3h7xDqWlWuqznS/tbstxIqmW3Zjkxlv+eYYnaeqjCk4
+        AqTwH4x1nxN4o0201fVLwaajtJbLG3lNcSBeDKVwzR4zhP4uC2QAKr+MPAmu634h1LVbbSbgaT9sdUt3
+        x5s7KcGQrn/Vlgdo/iGCeCMzeA/B+seHPFWmXeraZeHS2kaO3dIzK1vIV+USqORHyQHx8pADEDmuJOr7
+        X5/K3+f9bn07WB+o9LW025+e3Xry3+d/7p//2Q==
+</value>
+  </data>
+  <data name="ignoredImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
+        JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
+        MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QA
+        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
+        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
+        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
+        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
+        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0vxHquvS3lpY6HCu64kbddyAmC2jQjczYILM2cKgIzySQFNVv
+        CPinUJ9c1XQdV8uS902eNJZoQRHKkqlomUMSVOBhlJIBHBOeNHxPb3iaDqwt1u90ltMYpLJC86MVONig
+        glgemCOcciqvgjQVsdC01EtbiHcq3V1JdoUnnuGUF3kBLHeSeck46Z4FfKUp5l9camnbm07Wve7e3w6W
+        76777tQ5T//Z
+</value>
+  </data>
+  <data name="inconclusiveImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
+        JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
+        MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QA
+        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
+        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
+        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
+        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
+        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDs/FviDWn1xbLSd8YDMrztkRwKpAZmCsCzEnCrkZ6nABqLwd4v
+        1NvEV5omqS+fJbSorSxg7ZFlXMbLuJZTjAKkkDnBOeLXi/Q76GHUp7GG6cSxSNG1ou+VWKnO1Rg7gemP
+        bnNQeBPDFzb29hJNbXMCjbczvcoUmlmIBZnBydxOM5PbGeBXykXivbO6fNzab992+1tLbdT0LQ5d9Lf1
+        8z//2Q==
+</value>
+  </data>
+  <data name="skippedImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        /9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg
+        JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
+        MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QA
+        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
+        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
+        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
+        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
+        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1zVdYnS6eC3bYqHBYDJJp+kavPLci3uG37s7Wxgj2qPVdInN0
+        88CeYkhyQOoP9ado+kzx3K3FwuwJyqnqTQB//9k=
+</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 77afa7f..34cbfc3 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
@@ -17,6 +17,9 @@ namespace NUnit.Gui.SettingsPages
 		private System.Windows.Forms.GroupBox groupBox1;
 		private System.Windows.Forms.CheckBox visualStudioSupportCheckBox;
 		private System.Windows.Forms.HelpProvider helpProvider1;
+        private CheckBox useSolutionConfigsCheckBox;
+        private Label label2;
+        private Label label3;
 		private System.ComponentModel.IContainer components = null;
 
 		public VisualStudioSettingsPage(string key) : base(key)
@@ -49,48 +52,86 @@ namespace NUnit.Gui.SettingsPages
 		/// </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();
-			this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-			this.SuspendLayout();
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(0, 0);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(112, 16);
-			this.label1.TabIndex = 9;
-			this.label1.Text = "Visual Studio";
-			// 
-			// 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;
-			// 
-			// visualStudioSupportCheckBox
-			// 
-			this.helpProvider1.SetHelpString(this.visualStudioSupportCheckBox, "If checked, Visual Studio projects and solutions may be opened or added to existi" +
-				"ng test projects.");
-			this.visualStudioSupportCheckBox.Location = new System.Drawing.Point(24, 24);
-			this.visualStudioSupportCheckBox.Name = "visualStudioSupportCheckBox";
-			this.helpProvider1.SetShowHelp(this.visualStudioSupportCheckBox, true);
-			this.visualStudioSupportCheckBox.Size = new System.Drawing.Size(224, 25);
-			this.visualStudioSupportCheckBox.TabIndex = 30;
-			this.visualStudioSupportCheckBox.Text = "Enable Visual Studio Support";
-			// 
-			// VisualStudioSettingsPage
-			// 
-			this.Controls.Add(this.visualStudioSupportCheckBox);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.label1);
-			this.Name = "VisualStudioSettingsPage";
-			this.ResumeLayout(false);
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VisualStudioSettingsPage));
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.visualStudioSupportCheckBox = new System.Windows.Forms.CheckBox();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.useSolutionConfigsCheckBox = new System.Windows.Forms.CheckBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(0, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(68, 13);
+            this.label1.TabIndex = 9;
+            this.label1.Text = "Visual Studio";
+            // 
+            // 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(151, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(293, 8);
+            this.groupBox1.TabIndex = 8;
+            this.groupBox1.TabStop = false;
+            // 
+            // visualStudioSupportCheckBox
+            // 
+            this.visualStudioSupportCheckBox.AutoSize = true;
+            this.helpProvider1.SetHelpString(this.visualStudioSupportCheckBox, "If checked, Visual Studio projects and solutions may be opened or added to existi" +
+                    "ng test projects.");
+            this.visualStudioSupportCheckBox.Location = new System.Drawing.Point(24, 24);
+            this.visualStudioSupportCheckBox.Name = "visualStudioSupportCheckBox";
+            this.helpProvider1.SetShowHelp(this.visualStudioSupportCheckBox, true);
+            this.visualStudioSupportCheckBox.Size = new System.Drawing.Size(163, 17);
+            this.visualStudioSupportCheckBox.TabIndex = 30;
+            this.visualStudioSupportCheckBox.Text = "Enable Visual Studio Support";
+            this.visualStudioSupportCheckBox.CheckedChanged += new System.EventHandler(this.visualStudioSupportCheckBox_CheckedChanged);
+            // 
+            // useSolutionConfigsCheckBox
+            // 
+            this.useSolutionConfigsCheckBox.AutoSize = true;
+            this.useSolutionConfigsCheckBox.Location = new System.Drawing.Point(44, 60);
+            this.useSolutionConfigsCheckBox.Name = "useSolutionConfigsCheckBox";
+            this.useSolutionConfigsCheckBox.Size = new System.Drawing.Size(255, 17);
+            this.useSolutionConfigsCheckBox.TabIndex = 31;
+            this.useSolutionConfigsCheckBox.Text = "Use solution configs when opening VS solutions.";
+            this.useSolutionConfigsCheckBox.UseVisualStyleBackColor = true;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(110, 89);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(322, 124);
+            this.label2.TabIndex = 33;
+            this.label2.Text = resources.GetString("label2.Text");
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(39, 89);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(33, 13);
+            this.label3.TabIndex = 32;
+            this.label3.Text = "Note:";
+            // 
+            // VisualStudioSettingsPage
+            // 
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.useSolutionConfigsCheckBox);
+            this.Controls.Add(this.visualStudioSupportCheckBox);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.label1);
+            this.Name = "VisualStudioSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
 
 		}
 		#endregion
@@ -98,13 +139,20 @@ namespace NUnit.Gui.SettingsPages
 		public override void LoadSettings()
 		{
 			visualStudioSupportCheckBox.Checked = settings.GetSetting( "Options.TestLoader.VisualStudioSupport", false );
+            useSolutionConfigsCheckBox.Enabled = visualStudioSupportCheckBox.Checked;
+            useSolutionConfigsCheckBox.Checked = settings.GetSetting("Options.TestLoader.VisualStudio.UseSolutionConfigs", true);
 		}
 
 		public override void ApplySettings()
 		{
 			settings.SaveSetting( "Options.TestLoader.VisualStudioSupport", visualStudioSupportCheckBox.Checked );
+            settings.SaveSetting("Options.TestLoader.VisualStudio.UseSolutionConfigs", useSolutionConfigsCheckBox.Checked);
 		}
 
+        private void visualStudioSupportCheckBox_CheckedChanged(object sender, EventArgs e)
+        {
+            useSolutionConfigsCheckBox.Enabled = visualStudioSupportCheckBox.Checked;
+        }
 
 	}
 }
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.resx
index 8c2ca63..2ea6faa 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.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,87 +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="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="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.Name">
-    <value>VisualStudioSettingsPage</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>
+  </metadata>
+  <data name="label2.Text" xml:space="preserve">
+    <value>This setting should normally be checked if VS solutions are used. If it is unchecked, solution configs are ignored and all project configs are included in the NUnit project, as was done in versions of NUnit prior to 2.6.</value>
   </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs b/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
index baac6d8..ad382d7 100644
--- a/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
+++ b/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
@@ -69,9 +69,12 @@ namespace NUnit.Gui
             AppendBoldText(string.Format("{0} ( {1} )\r\n", moduleName, pid));
 
             TextBox.AppendText(string.Format(
-                "  CLR Version: {0} ( {1} )\r\n",
-                framework.ClrVersion.ToString(), 
+                "  Framework Version: {0}\r\n",
                 framework.DisplayName));
+
+            TextBox.AppendText(string.Format(
+                "  CLR Version: {0}\r\n",
+                framework.ClrVersion.ToString()));
         }
 
         private void AppendDomainInfo(TestAssemblyInfo info)
diff --git a/src/GuiRunner/nunit-gui/nunit-gui.build b/src/GuiRunner/nunit-gui/nunit-gui.build
index a2ff772..e61e0e8 100644
--- a/src/GuiRunner/nunit-gui/nunit-gui.build
+++ b/src/GuiRunner/nunit-gui/nunit-gui.build
@@ -10,14 +10,20 @@
     <include name="ExceptionDetailsForm.cs"/>
     <include name="GuiOptions.cs"/>
     <include name="NUnitForm.cs"/>
+    <include name="NUnitPresenter.cs"></include>
     <include name="OptionsDialog.cs"/>
     <include name="ProjectEditor.cs"/>
+    <include name="RecentFileMenuHandler.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/ProjectEditorSettingsPage.cs"/>
+    <include name="SettingsPages/ProjectEditorSettingsPage.Designer.cs"/>
+    <include name="SettingsPages/RuntimeSelectionSettingsPage.cs"/>
+    <include name="SettingsPages/RuntimeSelectionSettingsPage.Designer.cs"/>
     <include name="SettingsPages/TestLoaderSettingsPage.cs"/>
     <include name="SettingsPages/TestResultSettingsPage.cs"/>
     <include name="SettingsPages/TreeSettingsPage.cs"/>
@@ -37,6 +43,8 @@
     <include name="SettingsPages/AssemblyReloadSettingsPage.resx"/>
     <include name="SettingsPages/GuiSettingsPage.resx"/>
     <include name="SettingsPages/InternalTraceSettingsPage.resx"/>
+    <include name="SettingsPages/ProjectEditorSettingsPage.resx"/>
+    <include name="SettingsPages/RuntimeSelectionSettingsPage.resx"/>
     <include name="SettingsPages/TestLoaderSettingsPage.resx"/>
     <include name="SettingsPages/TestResultSettingsPage.resx"/>
     <include name="SettingsPages/TreeSettingsPage.resx"/>
diff --git a/src/GuiRunner/nunit-gui/nunit-gui.csproj b/src/GuiRunner/nunit-gui/nunit-gui.csproj
index f895794..993adb8 100644
--- a/src/GuiRunner/nunit-gui/nunit-gui.csproj
+++ b/src/GuiRunner/nunit-gui/nunit-gui.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -47,7 +47,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -122,15 +122,19 @@
       <SubType>Form</SubType>
     </Compile>
     <Compile Include="OptionsDialog.cs" />
-    <Compile Include="ProjectEditor.cs">
-      <SubType>Form</SubType>
-    </Compile>
+    <Compile Include="RecentFileMenuHandler.cs" />
     <Compile Include="SettingsPages\AdvancedLoaderSettingsPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Include="SettingsPages\AssemblyReloadSettingsPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
+    <Compile Include="SettingsPages\RuntimeSelectionSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\RuntimeSelectionSettingsPage.Designer.cs">
+      <DependentUpon>RuntimeSelectionSettingsPage.cs</DependentUpon>
+    </Compile>
     <Compile Include="SettingsPages\GuiSettingsPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -140,6 +144,12 @@
     <Compile Include="SettingsPages\InternalTraceSettingsPage.Designer.cs">
       <DependentUpon>InternalTraceSettingsPage.cs</DependentUpon>
     </Compile>
+    <Compile Include="SettingsPages\ProjectEditorSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\ProjectEditorSettingsPage.Designer.cs">
+      <DependentUpon>ProjectEditorSettingsPage.cs</DependentUpon>
+    </Compile>
     <Compile Include="SettingsPages\TestLoaderSettingsPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -155,6 +165,7 @@
     <Compile Include="TestAssemblyInfoForm.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Include="NUnitPresenter.cs" />
     <EmbeddedResource Include="AboutBox.resx">
       <DependentUpon>AboutBox.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -175,10 +186,6 @@
       <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>
@@ -187,6 +194,10 @@
       <DependentUpon>AssemblyReloadSettingsPage.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\RuntimeSelectionSettingsPage.resx">
+      <DependentUpon>RuntimeSelectionSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="SettingsPages\GuiSettingsPage.resx">
       <DependentUpon>GuiSettingsPage.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -195,6 +206,10 @@
       <DependentUpon>InternalTraceSettingsPage.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\ProjectEditorSettingsPage.resx">
+      <DependentUpon>ProjectEditorSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="SettingsPages\TestLoaderSettingsPage.resx">
       <DependentUpon>TestLoaderSettingsPage.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -215,6 +230,9 @@
   <ItemGroup>
     <None Include="nunit-gui.build" />
   </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PreBuildEvent>
diff --git a/src/GuiRunner/tests/ProjectEditorTests.cs b/src/GuiRunner/tests/ProjectEditorTests.cs
deleted file mode 100644
index 1ac6512..0000000
--- a/src/GuiRunner/tests/ProjectEditorTests.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
-// ****************************************************************
-using System;
-using System.IO;
-using System.Windows.Forms;
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.TestUtilities;
-
-namespace NUnit.Gui.Tests
-{
-	/// <summary>
-	/// Summary description for ProjectEditorTests.
-	/// </summary>
-	[TestFixture]
-	public class ProjectEditorTests : FormTester
-	{
-		private NUnitProject project;
-		private ProjectEditor editor;
-
-		[SetUp]
-		public void CreateFixtureObjects()
-		{
-			project = new NUnitProject( "temp.nunit" );
-			project.Configs.Add( "Debug" );
-			project.Configs.Add( "Release" );
-
-			editor = new ProjectEditor( project );
-			
-			this.Form = editor;
-		}
-
-		[TearDown]
-		public void Close()
-		{
-            //if ( editor != null )
-            //    editor.Close();
-		}
-		[Test]
-		public void CheckControls()
-		{
-			AssertControlExists( "projectPathLabel" );
-			AssertControlExists( "projectBaseTextBox" );
-			AssertControlExists( "groupBox1" );
-			AssertControlExists( "closeButton" );
-
-			ControlTester tester = new ControlTester( Controls["groupBox1"] );
-			tester.AssertControlExists( "configComboBox" );
-			tester.AssertControlExists( "editConfigsButton" );
-			tester.AssertControlExists( "projectTabControl" );
-		}
-
-        [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" ) );
-		}
-
-		[Test, Explicit("Fails when running on TeamCity Server")]
-		public void SetProjectBase()
-		{
-			editor.Show();
-            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/RecentFileMenuHandlerTests.cs b/src/GuiRunner/tests/RecentFileMenuHandlerTests.cs
new file mode 100644
index 0000000..cc2d0f3
--- /dev/null
+++ b/src/GuiRunner/tests/RecentFileMenuHandlerTests.cs
@@ -0,0 +1,100 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Windows.Forms;
+using NUnit.Framework;
+using NUnit.Util;
+
+namespace NUnit.Gui.Tests
+{
+	[TestFixture]
+	public class RecentFileMenuHandlerTests
+	{
+		private MenuItem menu;
+		private RecentFiles files;
+		private RecentFileMenuHandler handler;
+		
+		[SetUp]
+		public void SetUp()
+		{
+			menu = new MenuItem();
+			files = new FakeRecentFiles();
+			handler = new RecentFileMenuHandler( menu, files );
+            handler.CheckFilesExist = false;
+        }
+
+		[Test]
+		public void DisableOnLoadWhenEmpty()
+		{
+			handler.Load();
+			Assert.IsFalse( menu.Enabled );
+		}
+
+		[Test]
+		public void EnableOnLoadWhenNotEmpty()
+		{
+			files.SetMostRecent( "Test" );
+			handler.Load();
+			Assert.IsTrue( menu.Enabled );
+		}
+		[Test]
+		public void LoadMenuItems()
+		{
+			files.SetMostRecent( "Third" );
+			files.SetMostRecent( "Second" );
+			files.SetMostRecent( "First" );
+			handler.Load();
+			Assert.AreEqual( 3, menu.MenuItems.Count );
+			Assert.AreEqual( "1 First", menu.MenuItems[0].Text );
+		}
+
+		private class FakeRecentFiles : RecentFiles
+		{
+			private RecentFilesCollection files = new RecentFilesCollection();
+			private int maxFiles = 24;
+
+			public int Count
+			{
+				get { return files.Count; }
+			}
+
+			public int MaxFiles
+			{
+				get { return maxFiles; }
+				set { maxFiles = value; }
+			}
+
+			public void SetMostRecent( string fileName )
+			{
+				SetMostRecent( new RecentFileEntry( fileName ) );
+			}
+
+			public void SetMostRecent( RecentFileEntry entry )
+			{
+				files.Insert( 0, entry );
+			}
+
+			public RecentFilesCollection Entries
+			{
+				get { return files; }
+			}
+
+			public void Clear()
+			{
+				files.Clear();
+			}
+
+			public void Remove( string fileName )
+			{
+				files.Remove( fileName );
+			}
+		}
+	
+		// TODO: Need mock loader to test clicking
+	}
+}
diff --git a/src/GuiRunner/tests/nunit-gui.tests.build b/src/GuiRunner/tests/nunit-gui.tests.build
index f8d6076..a5af3f7 100644
--- a/src/GuiRunner/tests/nunit-gui.tests.build
+++ b/src/GuiRunner/tests/nunit-gui.tests.build
@@ -4,7 +4,7 @@
   <patternset id="source-files">
         <include name="CommandLineTests.cs"/>
         <include name="ExceptionDetailsFormTests.cs"/>
-        <include name="ProjectEditorTests.cs"/>
+    <include name="RecentFileMenuHandlerTests.cs"/>
   </patternset>
 
   <target name="build">
diff --git a/src/GuiRunner/tests/nunit-gui.tests.csproj b/src/GuiRunner/tests/nunit-gui.tests.csproj
index 1443a80..541ae10 100644
--- a/src/GuiRunner/tests/nunit-gui.tests.csproj
+++ b/src/GuiRunner/tests/nunit-gui.tests.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -46,7 +46,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -98,7 +98,7 @@
     </Compile>
     <Compile Include="CommandLineTests.cs" />
     <Compile Include="ExceptionDetailsFormTests.cs" />
-    <Compile Include="ProjectEditorTests.cs" />
+    <Compile Include="RecentFileMenuHandlerTests.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="nunit-gui.tests.build" />
diff --git a/src/NUnitCore/core/ActionsHelper.cs b/src/NUnitCore/core/ActionsHelper.cs
new file mode 100644
index 0000000..3dfc275
--- /dev/null
+++ b/src/NUnitCore/core/ActionsHelper.cs
@@ -0,0 +1,125 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+    internal class ActionsHelper
+    {
+        private static Type _ActionInterfaceType = null;
+
+        static ActionsHelper()
+        {
+            _ActionInterfaceType = Type.GetType(NUnitFramework.TestActionInterface);
+        }
+
+        public static void ExecuteActions(ActionPhase phase, IEnumerable<TestAction> actions, ITest test)
+        {
+            if (actions == null)
+                return;
+
+            TestAction[] filteredActions = GetFilteredAndSortedActions(actions, phase);
+
+            foreach (TestAction action in filteredActions)
+            {
+                if(phase == ActionPhase.Before)
+                    action.ExecuteBefore(test);
+                else
+                    action.ExecuteAfter(test);
+            }
+        }
+
+        public static TestAction[] GetActionsFromAttributeProvider(ICustomAttributeProvider attributeProvider)
+        {
+            if (attributeProvider == null || _ActionInterfaceType == null)
+                return new TestAction[0];
+
+            object[] targets = attributeProvider.GetCustomAttributes(_ActionInterfaceType, false);
+
+            List<TestAction> actions = new List<TestAction>();
+
+            foreach (var target in targets)
+                actions.Add(new TestAction(target));
+
+            actions.Sort(SortByTargetDescending);
+
+            return actions.ToArray();
+        }
+
+        public static TestAction[] GetActionsFromTypesAttributes(Type type)
+        {
+            if(type == null)
+                return new TestAction[0];
+
+            if(type == typeof(object))
+                return new TestAction[0];
+
+            List<TestAction> actions = new List<TestAction>();
+
+            actions.AddRange(GetActionsFromTypesAttributes(type.BaseType));
+
+            Type[] declaredInterfaces = GetDeclaredInterfaces(type);
+
+            foreach(Type interfaceType in declaredInterfaces)
+                actions.AddRange(GetActionsFromAttributeProvider(interfaceType));
+
+            actions.AddRange(GetActionsFromAttributeProvider(type));
+
+            return actions.ToArray();
+        }
+
+        private static Type[] GetDeclaredInterfaces(Type type)
+        {
+            List<Type> interfaces = new List<Type>(type.GetInterfaces());
+
+            if (type.BaseType == typeof(object))
+                return interfaces.ToArray();
+
+            List<Type> baseInterfaces = new List<Type>(type.BaseType.GetInterfaces());
+            List<Type> declaredInterfaces = new List<Type>();
+
+            foreach (Type interfaceType in interfaces)
+            {
+                if (!baseInterfaces.Contains(interfaceType))
+                    declaredInterfaces.Add(interfaceType);
+            }
+
+            return declaredInterfaces.ToArray();
+        }
+
+        private static TestAction[] GetFilteredAndSortedActions(IEnumerable<TestAction> actions, ActionPhase phase)
+        {
+            List<TestAction> filteredActions = new List<TestAction>();
+            foreach (TestAction actionItem in actions)
+            {
+                if (filteredActions.Contains(actionItem) != true)
+                    filteredActions.Add(actionItem);
+            }
+
+            if(phase == ActionPhase.After)
+                filteredActions.Reverse();
+
+            return filteredActions.ToArray();
+        }
+
+        private static int SortByTargetDescending(TestAction x, TestAction y)
+        {
+            return y.Targets.CompareTo(x.Targets);
+        }
+    }
+
+    public enum ActionPhase
+    {
+        Before,
+        After
+    }
+}
+#endif
diff --git a/src/NUnitCore/core/AssemblyHelper.cs b/src/NUnitCore/core/AssemblyHelper.cs
index fd21350..38626ed 100644
--- a/src/NUnitCore/core/AssemblyHelper.cs
+++ b/src/NUnitCore/core/AssemblyHelper.cs
@@ -20,17 +20,38 @@ namespace NUnit.Core
 
         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)
+            string uri = assembly.CodeBase;
+            
+            if (IsFileUri(uri))
+                return GetAssemblyPathFromFileUri(uri);
+            else
                 return assembly.Location;
+        }
+
+        #endregion
+
+        #region
+
+        // Public for testing purposes
+        public static string GetAssemblyPathFromFileUri(string uri)
+        {
+            // Skip over the file://
+            int start = Uri.UriSchemeFile.Length + Uri.SchemeDelimiter.Length;
 
-            if (uri.IsUnc)
-                return path.Substring(Uri.UriSchemeFile.Length + 1);
+            if (System.IO.Path.DirectorySeparatorChar == '\\')
+            {
+                // Handle Windows Drive specifications
+                if (uri[start] == '/' && uri[start + 2] == ':')
+                    ++start;
+            }
+            else
+            {
+                // Assume all Linux paths are absolute
+                if (uri[start] != '/')
+                    --start;
+            }
 
-            return uri.LocalPath;
+            return uri.Substring(start);
         }
 
         #endregion
@@ -41,5 +62,14 @@ namespace NUnit.Core
             return System.IO.Path.GetDirectoryName(GetAssemblyPath(assembly));
         }
         #endregion
+
+        #region Helper Methods
+
+        private static bool IsFileUri(string uri)
+        {
+            return uri.ToLower().StartsWith(Uri.UriSchemeFile);
+        }
+
+        #endregion
     }
 }
diff --git a/src/NUnitCore/core/Builders/CombinatorialStrategy.cs b/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
index 9d009c2..7d2a273 100644
--- a/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
+++ b/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
@@ -8,7 +8,7 @@ using System;
 using System.Collections;
 using System.Reflection;
 using NUnit.Core.Extensibility;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -23,7 +23,7 @@ namespace NUnit.Core.Builders
             IEnumerator[] enumerators = new IEnumerator[Sources.Length];
             int index = -1;
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             List<ParameterSet> testCases = new List<ParameterSet>();
 #else
 			ArrayList testCases = new ArrayList();
diff --git a/src/NUnitCore/core/Builders/DatapointProvider.cs b/src/NUnitCore/core/Builders/DatapointProvider.cs
index f88c04e..9f2af01 100644
--- a/src/NUnitCore/core/Builders/DatapointProvider.cs
+++ b/src/NUnitCore/core/Builders/DatapointProvider.cs
@@ -79,18 +79,21 @@ namespace NUnit.Core.Builders
                             case MemberTypes.Field:
                                 FieldInfo field = member as FieldInfo;
                                 instance = field.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
-                                datapoints.AddRange((ICollection)field.GetValue(instance));
+                                foreach (object data in (IEnumerable)field.GetValue(instance))
+                                    datapoints.Add(data);
                                 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));
+                                foreach (object data in (IEnumerable)property.GetValue(instance, null))
+                                    datapoints.Add(data);
                                 break;
                             case MemberTypes.Method:
                                 MethodInfo method = member as MethodInfo;
                                 instance = method.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
-                                datapoints.AddRange((ICollection)method.Invoke(instance, Type.EmptyTypes));
+                                foreach (object data in (IEnumerable)method.Invoke(instance, Type.EmptyTypes))
+                                    datapoints.Add(data);
                                 break;
                         }
                     }
@@ -138,7 +141,7 @@ namespace NUnit.Core.Builders
             if (type.IsArray)
                 return type.GetElementType();
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if (type.IsGenericType && type.Name == "IEnumerable`1")
                 return type.GetGenericArguments()[0];
 #endif
diff --git a/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs b/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
index 5bb8c68..2058c8a 100644
--- a/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
+++ b/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
@@ -24,8 +24,6 @@ namespace NUnit.Core.Builders
     /// </summary>
     public class NUnitTestCaseBuilder : ITestCaseBuilder2
 	{
-        private readonly bool allowOldStyleTests = NUnitConfiguration.AllowOldStyleTests;
-
         #region ITestCaseBuilder Methods
         /// <summary>
         /// Determines if the method can be used to build an NUnit test
@@ -50,12 +48,7 @@ namespace NUnit.Core.Builders
             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);
+                || Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, false);
         }
 
 		/// <summary>
@@ -100,6 +93,21 @@ namespace NUnit.Core.Builders
             ParameterizedMethodSuite methodSuite = new ParameterizedMethodSuite(method);
             NUnitFramework.ApplyCommonAttributes(method, methodSuite);
 
+            if (parentSuite != null)
+            {
+                if (parentSuite.RunState == RunState.NotRunnable && methodSuite.RunState != RunState.NotRunnable)
+                {
+                    methodSuite.RunState = RunState.NotRunnable;
+                    methodSuite.IgnoreReason = parentSuite.IgnoreReason;
+                }
+
+                if (parentSuite.RunState == RunState.Ignored && methodSuite.RunState != RunState.Ignored && methodSuite.RunState != RunState.NotRunnable)
+                {
+                    methodSuite.RunState = RunState.Ignored;
+                    methodSuite.IgnoreReason = parentSuite.IgnoreReason;
+                }
+            }
+
             foreach (object source in CoreExtensions.Host.TestCaseProviders.GetTestCasesFor(method, parentSuite))
             {
                 ParameterSet parms;
@@ -200,6 +208,10 @@ namespace NUnit.Core.Builders
                     testMethod.RunState = RunState.Ignored;
                     testMethod.IgnoreReason = parms.IgnoreReason;
                 }
+                else if (parms.Explicit)
+                {
+                    testMethod.RunState = RunState.Explicit;
+                }
 
                 if (parms.ExpectedExceptionName != null)
                     testMethod.exceptionProcessor = new ExpectedExceptionProcessor(testMethod, parms);
@@ -212,8 +224,26 @@ namespace NUnit.Core.Builders
                     testMethod.Description = parms.Description;
             }
 
-            if (testMethod.BuilderException != null)
-                testMethod.RunState = RunState.NotRunnable;
+            //if (testMethod.BuilderException != null && testMethod.RunState != RunState.NotRunnable)
+            //{
+            //    testMethod.RunState = RunState.NotRunnable;
+            //    testMethod.IgnoreReason = testMethod.BuilderException.Message;
+            //}
+
+            if (parentSuite != null)
+            {
+                if (parentSuite.RunState == RunState.NotRunnable && testMethod.RunState != RunState.NotRunnable)
+                {
+                    testMethod.RunState = RunState.NotRunnable;
+                    testMethod.IgnoreReason = parentSuite.IgnoreReason;
+                }
+
+                if (parentSuite.RunState == RunState.Ignored && testMethod.RunState != RunState.Ignored && testMethod.RunState != RunState.NotRunnable)
+                {
+                    testMethod.RunState = RunState.Ignored;
+                    testMethod.IgnoreReason = parentSuite.IgnoreReason;
+                }
+            }
 
             return testMethod;
         }
@@ -261,10 +291,11 @@ namespace NUnit.Core.Builders
             if (parms != null)
             {
                 testMethod.arguments = parms.Arguments;
-                testMethod.expectedResult = parms.Result;
                 testMethod.hasExpectedResult = parms.HasExpectedResult;
+                if (testMethod.hasExpectedResult)
+                    testMethod.expectedResult = parms.Result;
                 testMethod.RunState = parms.RunState;
-                testMethod.IgnoreReason = parms.NotRunReason;
+                testMethod.IgnoreReason = parms.IgnoreReason;
                 testMethod.BuilderException = parms.ProviderException;
 
                 arglist = parms.Arguments;
@@ -327,7 +358,7 @@ namespace NUnit.Core.Builders
                 return false;
             }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if (testMethod.Method.IsGenericMethodDefinition)
             {
                 Type[] typeArguments = GetTypeArgumentsForMethod(testMethod.Method, arglist);
@@ -362,7 +393,7 @@ namespace NUnit.Core.Builders
             return true;
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         private static Type[] GetTypeArgumentsForMethod(MethodInfo method, object[] arglist)
         {
             Type[] typeParameters = method.GetGenericArguments();
diff --git a/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs b/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
index e0b8215..923dac3 100644
--- a/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
+++ b/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
@@ -43,6 +43,7 @@ namespace NUnit.Core.Builders
 			return Reflect.HasAttribute( type, NUnitFramework.TestFixtureAttribute, true ) ||
                    Reflect.HasMethodWithAttribute(type, NUnitFramework.TestAttribute, true) ||
                    Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseAttribute, true) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseSourceAttribute, true) ||
                    Reflect.HasMethodWithAttribute(type, NUnitFramework.TheoryAttribute, true);
 		}
 
@@ -55,7 +56,7 @@ namespace NUnit.Core.Builders
 		{
             Attribute[] attrs = GetTestFixtureAttributes(type);
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if (type.IsGenericType)
                 return BuildMultipleFixtures(type, attrs);
 #endif
@@ -106,7 +107,7 @@ namespace NUnit.Core.Builders
                 arguments = (object[])Reflect.GetPropertyValue(attr, "Arguments");
 
                 categories = Reflect.GetPropertyValue(attr, "Categories") as IList;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 if (type.ContainsGenericParameters)
                 {
                     Type[] typeArgs = (Type[])Reflect.GetPropertyValue(attr, "TypeArgs");
@@ -236,7 +237,7 @@ namespace NUnit.Core.Builders
             //    return false;
             //}
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if ( fixtureType.ContainsGenericParameters )
             {
                 reason = "Fixture type contains generic parameters. You must either provide "
diff --git a/src/NUnitCore/core/Builders/PairwiseStrategy.cs b/src/NUnitCore/core/Builders/PairwiseStrategy.cs
index 93f55b5..ef01e71 100644
--- a/src/NUnitCore/core/Builders/PairwiseStrategy.cs
+++ b/src/NUnitCore/core/Builders/PairwiseStrategy.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 using System.Reflection;
@@ -637,7 +637,7 @@ namespace NUnit.Core.Builders
 
 			IEnumerable pairwiseTestCases = new PairwiseTestCaseGenerator(dimensions).GetTestCases();
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             List<ParameterSet> testCases = new List<ParameterSet>();
 #else
             ArrayList testCases = new ArrayList();
diff --git a/src/NUnitCore/core/Builders/ProviderInfo.cs b/src/NUnitCore/core/Builders/ProviderInfo.cs
index 5ff2654..e97e256 100644
--- a/src/NUnitCore/core/Builders/ProviderInfo.cs
+++ b/src/NUnitCore/core/Builders/ProviderInfo.cs
@@ -15,8 +15,9 @@ namespace NUnit.Core.Builders
         private Type providerType;
         private string providerName;
         private object[] providerArgs;
+        private string category;
 
-        public ProviderReference(Type providerType, string providerName)
+        public ProviderReference(Type providerType, string providerName, string category)
         {
             if (providerType == null)
                 throw new ArgumentNullException("providerType");
@@ -25,10 +26,11 @@ namespace NUnit.Core.Builders
 
             this.providerType = providerType;
             this.providerName = providerName;
+            this.category = category;
         }
 
-        public ProviderReference(Type providerType, object[] args, string providerName)
-            : this(providerType, providerName)
+        public ProviderReference(Type providerType, object[] args, string providerName, string category)
+            : this(providerType, providerName, category)
         {
             this.providerArgs = args;
         }
@@ -38,6 +40,11 @@ namespace NUnit.Core.Builders
             get { return this.providerName; }
         }
 
+        public string Category
+        {
+            get { return this.category; }
+        }
+
         public IEnumerable GetInstance()
         {
                 MemberInfo[] members = providerType.GetMember(
diff --git a/src/NUnitCore/core/Builders/SequentialStrategy.cs b/src/NUnitCore/core/Builders/SequentialStrategy.cs
index fbee9c8..bbb1ff6 100644
--- a/src/NUnitCore/core/Builders/SequentialStrategy.cs
+++ b/src/NUnitCore/core/Builders/SequentialStrategy.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 using System.Reflection;
@@ -20,7 +20,7 @@ namespace NUnit.Core.Builders
 
         public override IEnumerable GetTestCases()
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             List<ParameterSet> testCases = new List<ParameterSet>();
 #else
             ArrayList testCases = new ArrayList();
diff --git a/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs b/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
index 586db7d..63cd4c8 100644
--- a/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
+++ b/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
@@ -86,12 +86,12 @@ namespace NUnit.Core.Builders
                 // a type, we handle it specially
                 Type testType = assembly.GetType(testName);
                 if (testType != null)
-                    return Build(assemblyName, testType, autoSuites);
+                    return Build(assembly, 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 BuildTestAssembly(this.assembly, assemblyName, fixtures, autoSuites);
 
                 return null;
             }
@@ -107,11 +107,11 @@ namespace NUnit.Core.Builders
                 if (this.assembly == null) return null;
 
                 IList fixtures = GetFixtures(assembly, null);
-                return BuildTestAssembly(assemblyName, fixtures, autoSuites);
+                return BuildTestAssembly(this.assembly, assemblyName, fixtures, autoSuites);
             }
 		}
 
-		private Test Build( string assemblyName, Type testType, bool autoSuites )
+		private Test Build( Assembly assembly, string assemblyName, Type testType, bool autoSuites )
 		{
 			// TODO: This is the only situation in which we currently
 			// recognize and load legacy suites. We need to determine 
@@ -119,14 +119,14 @@ namespace NUnit.Core.Builders
 			if ( legacySuiteBuilder.CanBuildFrom( testType ) )
 				return legacySuiteBuilder.BuildFrom( testType );
 			else if ( TestFixtureBuilder.CanBuildFrom( testType ) )
-				return BuildTestAssembly( assemblyName,
+				return BuildTestAssembly( assembly, assemblyName,
 					new Test[] { TestFixtureBuilder.BuildFrom( testType ) }, autoSuites );
 			return null;
 		}
 
-		private TestSuite BuildTestAssembly( string assemblyName, IList fixtures, bool autoSuites )
+		private TestSuite BuildTestAssembly( Assembly assembly, string assemblyName, IList fixtures, bool autoSuites )
 		{
-			TestSuite testAssembly = new TestAssembly( assemblyName );
+			 TestSuite testAssembly = new TestAssembly( assembly, assemblyName );
 
 			if ( autoSuites )
 			{
@@ -149,7 +149,7 @@ namespace NUnit.Core.Builders
                     testAssembly.Add(fixture);
                 }
 			}
-
+	
             NUnitFramework.ApplyCommonAttributes( assembly, testAssembly );
 
             testAssembly.Properties["_PID"] = System.Diagnostics.Process.GetCurrentProcess().Id;
@@ -192,7 +192,7 @@ namespace NUnit.Core.Builders
 			IList testTypes = GetCandidateFixtureTypes( assembly, ns );
 
             log.Debug("Found {0} classes to examine", testTypes.Count);
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
             timer.Start();
 #endif
@@ -201,9 +201,9 @@ namespace NUnit.Core.Builders
 			{
 				if( TestFixtureBuilder.CanBuildFrom( testType ) )
 					fixtures.Add( TestFixtureBuilder.BuildFrom( testType ) );
-			}
+            }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             log.Debug("Found {0} fixtures in {1} seconds", fixtures.Count, timer.Elapsed);
 #else
             log.Debug("Found {0} fixtures", fixtures.Count);
diff --git a/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs b/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
index d96f21e..96b05bc 100644
--- a/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
+++ b/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
@@ -49,25 +49,39 @@ namespace NUnit.Core.Builders
                     int argsProvided = parms.Arguments.Length;
 
                     // Special handling for params arguments
-                    if (argsProvided > argsNeeded)
+                    if (argsNeeded > 0 && argsProvided >= argsNeeded - 1)
                     {
                         ParameterInfo lastParameter = parameters[argsNeeded - 1];
                         Type lastParameterType = lastParameter.ParameterType;
-
+                        Type elementType = lastParameterType.GetElementType();
+                        
                         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 (argsProvided == argsNeeded)
+                            {
+                                Type lastArgumentType = parms.Arguments[argsProvided - 1].GetType();
+                                if (!lastParameterType.IsAssignableFrom(lastArgumentType))
+                                {
+                                    Array array = Array.CreateInstance(elementType, 1);
+                                    array.SetValue(parms.Arguments[argsProvided - 1], 0);
+                                    parms.Arguments[argsProvided - 1] = array;
+                                }
+                            }
+                            else
+                            {
+                                object[] newArglist = new object[argsNeeded];
+                                for (int i = 0; i < argsNeeded && i < argsProvided; i++)
+                                    newArglist[i] = parms.Arguments[i];
+
+                                int length = argsProvided - argsNeeded + 1;
+                                Array array = Array.CreateInstance(elementType, 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;
+                            }
                         }
                     }
 
diff --git a/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs b/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
index 7d1db69..c6d2a2c 100644
--- a/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
+++ b/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
@@ -70,8 +70,54 @@ namespace NUnit.Core.Builders
 
             foreach (ProviderReference info in GetSourcesFor(method, parentSuite))
             {
-                foreach (object o in info.GetInstance())
-                    parameterList.Add(o);
+                foreach (object source in info.GetInstance())
+                {
+                    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 };
+                        }
+                    }
+
+                    if (info.Category != null)
+                        foreach (string cat in info.Category.Split(new char[] { ',' }))
+                            parms.Categories.Add(cat);
+
+                    parameterList.Add(parms);
+                }
             }
 
             return parameterList;
@@ -88,17 +134,18 @@ namespace NUnit.Core.Builders
             {
                 Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
                 string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
+                string category = Reflect.GetPropertyValue(sourceAttr, "Category") as string;
 
                 if (sourceType == null)
                 {
                     if (parentSuite != null)
-                        sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName));
+                        sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName, category));
                     else
-                        sources.Add(new ProviderReference(method.ReflectedType, sourceName));
+                        sources.Add(new ProviderReference(method.ReflectedType, sourceName, category));
                 }
                 else
                 {
-                    sources.Add(new ProviderReference(sourceType, sourceName));
+                    sources.Add(new ProviderReference(sourceType, sourceName, category));
                 }
 
             }
diff --git a/src/NUnitCore/core/Builders/ValueSourceProvider.cs b/src/NUnitCore/core/Builders/ValueSourceProvider.cs
index df20713..463c5d0 100644
--- a/src/NUnitCore/core/Builders/ValueSourceProvider.cs
+++ b/src/NUnitCore/core/Builders/ValueSourceProvider.cs
@@ -95,11 +95,11 @@ namespace NUnit.Core.Builders
                 string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
 
                 if (sourceType != null)
-                    sources.Add(new ProviderReference(sourceType, sourceName));
+                    sources.Add(new ProviderReference(sourceType, sourceName, null));
                 else if (parentSuite != null)
-                    sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName));
+                    sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName, null));
                 else
-                    sources.Add(new ProviderReference(parameter.Member.ReflectedType, sourceName));
+                    sources.Add(new ProviderReference(parameter.Member.ReflectedType, sourceName, null));
             }
             return sources;
         }
diff --git a/src/NUnitCore/core/ContextDictionary.cs b/src/NUnitCore/core/ContextDictionary.cs
new file mode 100644
index 0000000..84a28ec
--- /dev/null
+++ b/src/NUnitCore/core/ContextDictionary.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// 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.Core
+{
+    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);
+                    case "WorkDirectory":
+                        return _ec.TestPackage.Settings.Contains("WorkDirectory")
+                            ? _ec.TestPackage.Settings["WorkDirectory"]
+                            : Environment.CurrentDirectory;
+                    default:
+                        return base[key];
+                }
+            }
+            set
+            {
+                base[key] = value;
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/DomainAgent.cs b/src/NUnitCore/core/DomainAgent.cs
index 5dd3cd2..6448ad7 100644
--- a/src/NUnitCore/core/DomainAgent.cs
+++ b/src/NUnitCore/core/DomainAgent.cs
@@ -5,8 +5,8 @@
 // ****************************************************************
 
 using System;
+using System.IO;
 using System.Reflection;
-using System.Diagnostics;
 
 namespace NUnit.Core
 {
@@ -26,7 +26,7 @@ namespace NUnit.Core
         /// <returns>A proxy for the DomainAgent in the other domain</returns>
         static public DomainAgent CreateInstance(AppDomain targetDomain)
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
                 targetDomain,
 #else
@@ -108,7 +108,7 @@ namespace NUnit.Core
         /// <returns>A proxy for the DomainAgent in the other domain</returns>
         static public DomainInitializer CreateInstance(AppDomain targetDomain)
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstanceFrom(
                 targetDomain,
 #else
@@ -140,6 +140,17 @@ namespace NUnit.Core
             AssemblyResolver resolver = new AssemblyResolver();
             resolver.AddDirectory(NUnitConfiguration.NUnitLibDirectory);
             resolver.AddDirectory(NUnitConfiguration.AddinDirectory);
+						
+			// TODO: Temporary additions till we resolve a problem with pnunit
+            // Test for existence is needed to avoid messing when the installation
+            // does not include pnunit.
+            string binDir = NUnitConfiguration.NUnitBinDirectory;
+            string pnunitFrameworkPath = Path.Combine(binDir, "pnunit.framework.dll");
+            if (File.Exists(pnunitFrameworkPath))
+                resolver.AddFile(pnunitFrameworkPath);
+            string pnunitAgentPath = Path.Combine(binDir, "pnunit-agent.exe");
+            if (File.Exists(pnunitAgentPath))
+                resolver.AddFile(pnunitAgentPath);
         }
 
         void OnDomainUnload(object sender, EventArgs e)
diff --git a/src/NUnitCore/core/InternalTrace.cs b/src/NUnitCore/core/InternalTrace.cs
index 10ca686..21ec2ea 100644
--- a/src/NUnitCore/core/InternalTrace.cs
+++ b/src/NUnitCore/core/InternalTrace.cs
@@ -30,6 +30,8 @@ namespace NUnit.Core
         private readonly static string TIME_FMT = "HH:mm:ss.fff";
 
 		private static bool initialized;
+		private static InternalTraceLevel level;
+        private static string logName;
 
         private static InternalTraceWriter writer;
         public static InternalTraceWriter Writer
@@ -37,26 +39,43 @@ namespace NUnit.Core
             get { return writer; }
         }
 
-		public static InternalTraceLevel Level;
+        private static string LogName
+        {
+            get { return logName; }
+            set { logName = value; }
+        }
 
-        public static void Initialize(string logName)
+        public static InternalTraceLevel Level
         {
-            int lev = (int) new System.Diagnostics.TraceSwitch("NTrace", "NUnit internal trace").Level;
-            Initialize(logName, (InternalTraceLevel)lev);
+            get { return level; }
+            set 
+            {
+                if (level != value)
+                {
+                    level = value;
+
+                    if (writer == null && Level > InternalTraceLevel.Off)
+                    {
+                        writer = new InternalTraceWriter(logName);
+                        writer.WriteLine("InternalTrace: Initializing at level " + Level.ToString());
+                    }
+                }
+            }
         }
 
+        //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)
 			{
+                LogName = logName;
 				Level = level;
 
-				if (writer == null && Level > InternalTraceLevel.Off)
-				{
-					writer = new InternalTraceWriter(logName);
-					writer.WriteLine("InternalTrace: Initializing at level " + Level.ToString());
-				}
-
 				initialized = true;
 			}
         }
@@ -95,7 +114,7 @@ namespace NUnit.Core
             Writer.WriteLine("{0} {1,-5} [{2,2}] {3}: {4}",
                 DateTime.Now.ToString(TIME_FMT),
                 level == InternalTraceLevel.Verbose ? "Debug" : level.ToString(),
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 System.Threading.Thread.CurrentThread.ManagedThreadId,
 #else
                 AppDomain.GetCurrentThreadId(),
diff --git a/src/NUnitCore/core/InternalTraceWriter.cs b/src/NUnitCore/core/InternalTraceWriter.cs
index 527f875..4c76ccd 100644
--- a/src/NUnitCore/core/InternalTraceWriter.cs
+++ b/src/NUnitCore/core/InternalTraceWriter.cs
@@ -17,24 +17,6 @@ namespace NUnit.Core
 	{
         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;
@@ -44,7 +26,7 @@ namespace NUnit.Core
 				.Replace("%p", pId.ToString() )
 				.Replace("%a", domainName );
 
-            string logPath = Path.Combine(LogDirectory, fileName);
+            string logPath = Path.Combine(NUnitConfiguration.LogDirectory, fileName);
             this.writer = new StreamWriter(logPath, true);
             this.writer.AutoFlush = true;
 		}
diff --git a/src/NUnitCore/core/Log4NetCapture.cs b/src/NUnitCore/core/Log4NetCapture.cs
index 38158ed..b5a8b4c 100644
--- a/src/NUnitCore/core/Log4NetCapture.cs
+++ b/src/NUnitCore/core/Log4NetCapture.cs
@@ -16,9 +16,24 @@ namespace NUnit.Core
 	/// allowing NUnit to work with multiple versions of log4net
 	/// and to fail gracefully if no log4net assembly is present.
 	/// </summary>
-	public class Log4NetCapture : LogCapture
+	public class Log4NetCapture : TextCapture
 	{
-		private Assembly log4netAssembly;
+        /// <summary>
+        /// The TextWriter to which text is redirected
+        /// </summary>
+        private TextWriter writer;
+
+        /// <summary>
+        /// The threshold for capturing text. A value of "Off"
+        /// means that no text is captured. A value of "All"
+        /// should be taken to mean the highest possible level
+        /// of verbosity supported by the derived class. The 
+        /// meaning of any other values is determined by the 
+        /// derived class.
+        /// </summary>
+        private LoggingThreshold threshold = LoggingThreshold.Off;
+
+        private Assembly log4netAssembly;
 		private Type appenderType;
 		private Type basicConfiguratorType;
 
@@ -42,11 +57,57 @@ namespace NUnit.Core
 		private static readonly string logFormat =
 			"%d{ABSOLUTE} %-5p [%4t] %c{1} [%x]- %m%n";
 
-		protected override void StartCapture()
+        /// <summary>
+        /// Gets or sets the TextWriter to which text is redirected
+        /// when captured. The value may only be changed when the
+        /// logging threshold is set to "Off"
+        /// </summary>
+        public override TextWriter Writer
+        {
+            get { return writer; }
+            set
+            {
+                if (threshold != LoggingThreshold.Off)
+                    throw new System.InvalidOperationException(
+                        "Writer may not be changed while capture is enabled");
+
+                writer = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the capture threshold value, which represents
+        /// the degree of verbosity of the output text stream.
+        /// Derived classes may supply multiple levels of capture but
+        /// must retain the use of the "Off" setting to represent 
+        /// no logging.
+        /// </summary>
+        public override LoggingThreshold Threshold
+        {
+            get { return threshold; }
+            set
+            {
+                if (value != threshold)
+                {
+                    bool turnOff = value == LoggingThreshold.Off;
+                    //bool turnOn = threshold == LoggingThreshold.Off;
+
+                    //if (turnOff)
+                        StopCapture();
+
+                    threshold = value;
+
+                    if (!turnOff)
+                        StartCapture();
+                }
+            }
+        }
+        
+        private void StartCapture()
 		{
-			if ( IsInitialized )
+            if (IsLog4netAvailable)
 			{
-				string threshold = DefaultThreshold;
+                string threshold = Threshold.ToString();
 				if ( !SetLoggingThreshold( threshold ) )
 					SetLoggingThreshold( "Error" );
 
@@ -55,66 +116,67 @@ namespace NUnit.Core
 			}
 		}
 
-		protected override void StopCapture()
+        private void ResumeCapture()
+        {
+            if (IsLog4netAvailable)
+            {
+                SetLoggingThreshold(Threshold.ToString());
+                ConfigureAppender();
+            }
+        }
+
+		private void StopCapture()
 		{
+            if ( writer != null )
+                writer.Flush();
+
 			if ( appender != null )
 			{
 				SetLoggingThreshold( "Off" );
-				SetAppenderTextWriter( null );
-			}
-		}
-
-		#region Helpers
-		private bool IsInitialized
-		{
-			get
-			{
-				if ( isInitialized )
-					return true;
-
-				try
-				{
-					log4netAssembly = Assembly.Load( "log4net" );
-					if ( log4netAssembly == null ) return false;
-
-					appenderType = log4netAssembly.GetType( 
-						"log4net.Appender.TextWriterAppender", false, false );
-					if ( appenderType == null ) return false;
-
-					basicConfiguratorType = log4netAssembly.GetType( 
-						"log4net.Config.BasicConfigurator", false, false );
-					if ( basicConfiguratorType == null ) return false;
-
-					appender = TryCreateAppender();
-					if ( appender == null ) return false;
-
-					SetAppenderLogFormat( logFormat );
-
-					isInitialized = true;
-				}
-				catch
-				{
-				}
-
-				return isInitialized;
+                //SetAppenderTextWriter( null );
 			}
 		}
 
-		private Assembly TryLoadLog4NetAssembly()
-		{
-			Assembly assembly = null;
-
-			try
-			{
-				assembly = Assembly.Load( "log4net" );
-			}
-			catch
-			{
-				return null; 
-			}
-
-			return assembly;
-		}
+		#region Private Properties and Methods
+
+        private bool IsLog4netAvailable
+        {
+            get
+            {
+                if (!isInitialized)
+                    InitializeTypes();
+
+                return log4netAssembly != null && basicConfiguratorType != null && appenderType != null;
+            }       
+        }
+
+        private void InitializeTypes()
+        {
+            try
+            {
+                log4netAssembly = Assembly.Load("log4net");
+
+                if (log4netAssembly != null)
+                {
+                    appenderType = log4netAssembly.GetType(
+                        "log4net.Appender.TextWriterAppender", false, false);
+
+                    basicConfiguratorType = log4netAssembly.GetType(
+                        "log4net.Config.BasicConfigurator", false, false);
+
+                    appender = TryCreateAppender();
+                    if (appender != null)
+                        SetAppenderLogFormat(logFormat);
+                }
+            }
+            catch
+            {
+            }
+            finally
+            {
+                isInitialized = true;
+            }
+        }
 
 		/// <summary>
 		/// Attempt to create a TextWriterAppender using reflection,
diff --git a/src/NUnitCore/core/LogCapture.cs b/src/NUnitCore/core/LogCapture.cs
deleted file mode 100644
index 79a930b..0000000
--- a/src/NUnitCore/core/LogCapture.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-// ****************************************************************
-// 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.Specialized;
-using System.Configuration;
-
-namespace NUnit.Core
-{
-    public abstract class LogCapture : TextCapture
-    {
-        private string defaultThreshold;
-
-        /// <summary>
-        /// The default threshold for log capture
-        /// is read from the config file. If not
-        /// found, we use "Error".
-        /// </summary>
-        public override string DefaultThreshold
-        {
-            get
-            {
-                if (defaultThreshold == null)
-                {
-                    defaultThreshold = "Error";
-
-                    NameValueCollection settings = (NameValueCollection)
-#if NET_2_0
-                        ConfigurationManager.GetSection("NUnit/TestRunner");
-#else
-                        ConfigurationSettings.GetConfig("NUnit/TestRunner");
-#endif
-
-                    if (settings != null)
-                    {
-                        string level = settings["DefaultLogThreshold"];
-                        if (level != null)
-                            defaultThreshold = level;
-                    }
-                }
-
-                return defaultThreshold;
-            }
-        }
-    }
-}
diff --git a/src/NUnitCore/core/MethodHelper.cs b/src/NUnitCore/core/MethodHelper.cs
index 8a33b3e..bb295eb 100644
--- a/src/NUnitCore/core/MethodHelper.cs
+++ b/src/NUnitCore/core/MethodHelper.cs
@@ -16,7 +16,7 @@ namespace NUnit.Core
         {
             StringBuilder sb = new StringBuilder(method.Name);
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if (method.IsGenericMethod)
             {
                 sb.Append("<");
diff --git a/src/NUnitCore/core/NUnitConfiguration.cs b/src/NUnitCore/core/NUnitConfiguration.cs
index 0b6a7b9..596a985 100644
--- a/src/NUnitCore/core/NUnitConfiguration.cs
+++ b/src/NUnitCore/core/NUnitConfiguration.cs
@@ -20,81 +20,8 @@ namespace NUnit.Core
     /// </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
         {
@@ -148,6 +75,28 @@ namespace NUnit.Core
         }
         #endregion
 
+        #region NUnitDocDirectory
+        private static string nunitDocDirectory;
+        private static string NUnitDocDirectory
+        {
+            get
+            {
+                if (nunitDocDirectory == null)
+                {
+                    string dir = Path.GetDirectoryName(NUnitBinDirectory);
+                    nunitDocDirectory = Path.Combine(dir, "doc");
+                    if (!Directory.Exists(nunitDocDirectory))
+                    {
+                        dir = Path.GetDirectoryName(dir);
+                        nunitDocDirectory = Path.Combine(dir, "doc");
+                    }
+                }
+
+                return nunitDocDirectory;
+            }
+        }
+        #endregion
+
         #region AddinDirectory
         private static string addinDirectory;
         public static string AddinDirectory
@@ -247,7 +196,7 @@ namespace NUnit.Core
                 if (applicationDirectory == null)
                 {
                     applicationDirectory = Path.Combine(
-                        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+                        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                         "NUnit");
                 }
 
@@ -256,127 +205,57 @@ namespace NUnit.Core
         }
         #endregion
 
-        #region HelpUrl
-        public static string HelpUrl
+        #region LogDirectory
+        private static string logDirectory;
+        public static string LogDirectory
         {
             get
             {
-#if NET_2_0
-                string helpUrl = ConfigurationManager.AppSettings["helpUrl"];
-#else
-                string helpUrl = ConfigurationSettings.AppSettings["helpUrl"];
-#endif
-
-                if (helpUrl == null)
+                if (logDirectory == 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();
-                            }
-                        }
-                    }
+                    logDirectory = Path.Combine(ApplicationDirectory, "logs");
                 }
 
-                return helpUrl;
+                return logDirectory;
             }
         }
         #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)
+        #region HelpUrl
+        public static string HelpUrl
         {
-            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
+            get
             {
-                search = v2Strings;
-                replace = v1Strings;
-            }
+                string helpUrl = "http://nunit.org";
+
+                string dir = Path.GetDirectoryName(NUnitBinDirectory);
+                string docDir = null;
 
-            // Look for current value in path so it can be replaced
-            string current = null;
-            foreach (string s in search)
-                if (dir.IndexOf(s) >= 0)
+                while (dir != null)
                 {
-                    current = s;
-                    break;
+                    docDir = Path.Combine(dir, "doc");
+                    if (Directory.Exists(docDir))
+                        break;
+                    dir = Path.GetDirectoryName(dir);
                 }
 
-            // 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;
+                if (docDir != null)
+                {
+                    string localPath = Path.Combine(docDir, "index.html");
+                    if (File.Exists(localPath))
+                    {
+                        UriBuilder uri = new UriBuilder();
+                        uri.Scheme = "file";
+                        uri.Host = "localhost";
+                        uri.Path = localPath;
+                        helpUrl = uri.ToString();
+                    }
+                }
 
-            // Now try all the alternatives
-            foreach (string target in replace)
-            {
-                altDir = dir.Replace(current, target);
-                if (Directory.Exists(altDir))
-                    return altDir;
+                return helpUrl;
             }
-
-            // 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
 
         #endregion
     }
diff --git a/src/NUnitCore/core/NUnitFramework.cs b/src/NUnitCore/core/NUnitFramework.cs
index 35aa6f1..981c7e3 100644
--- a/src/NUnitCore/core/NUnitFramework.cs
+++ b/src/NUnitCore/core/NUnitFramework.cs
@@ -55,6 +55,11 @@ namespace NUnit.Core
         #endregion
 
         #region Other Framework Types
+
+        public static readonly string TestActionInterface = "NUnit.Framework.ITestAction, nunit.framework";
+
+	    public static readonly string TestDetailsClass = "NUnit.Framework.TestDetails, nunit.framework";
+
         public static readonly string AssertException = "NUnit.Framework.AssertionException";
         public static readonly string IgnoreException = "NUnit.Framework.IgnoreException";
         public static readonly string InconclusiveException = "NUnit.Framework.InconclusiveException";
@@ -226,7 +231,7 @@ namespace NUnit.Core
                             string categoryName = (string)Reflect.GetPropertyValue(attribute, PropertyNames.CategoryName);
                             test.Categories.Add(categoryName);
 
-                            if (categoryName.IndexOfAny(new char[] { ',', '!', '+', '-' }) >= 0)
+                            if (!IsValidCategoryName(categoryName))
                             {
                                 test.RunState = RunState.NotRunnable;
                                 test.IgnoreReason = "Category name must not contain ',', '!', '+' or '-'";
@@ -247,7 +252,7 @@ namespace NUnit.Core
                                  test.IgnoreReason = GetIgnoreReason(attribute);
                              }
                          }
-                         else if ( Reflect.InheritsFrom( attributeType, IgnoreAttribute ) )
+                        else if (Reflect.InheritsFrom(attributeType, IgnoreAttribute))
                          {
                              if (isValid)
                              {
@@ -433,5 +438,17 @@ namespace NUnit.Core
                             return ResultState.Error;
         }
         #endregion
+
+        #region IsValidCategoryName
+
+        /// <summary>
+        /// Returns true if the category name is valid
+        /// </summary>
+        public static bool IsValidCategoryName(string name)
+        {
+            return name.IndexOfAny(new char[] { ',', '!', '+', '-' }) < 0;
+        }
+
+        #endregion
     }
 }
diff --git a/src/NUnitCore/core/NUnitTestFixture.cs b/src/NUnitCore/core/NUnitTestFixture.cs
index 31d2042..a07e0df 100644
--- a/src/NUnitCore/core/NUnitTestFixture.cs
+++ b/src/NUnitCore/core/NUnitTestFixture.cs
@@ -6,6 +6,7 @@
 
 using System;
 using System.Reflection;
+using System.Collections;
 
 namespace NUnit.Core
 {
@@ -28,6 +29,10 @@ namespace NUnit.Core
                 Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.SetUpAttribute, true);
             this.tearDownMethods = 
                 Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.TearDownAttribute, true);
+
+#if CLR_2_0 || CLR_4_0
+            this.actions = ActionsHelper.GetActionsFromTypesAttributes(fixtureType);
+#endif
         }
 
         protected override void DoOneTimeSetUp(TestResult suiteResult)
diff --git a/src/NUnitCore/core/ParameterizedFixtureSuite.cs b/src/NUnitCore/core/ParameterizedFixtureSuite.cs
index 50daa4a..435a4fe 100644
--- a/src/NUnitCore/core/ParameterizedFixtureSuite.cs
+++ b/src/NUnitCore/core/ParameterizedFixtureSuite.cs
@@ -34,7 +34,7 @@ namespace NUnit.Core
         {
             get
             {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 if (type.IsGenericType)
                     return "GenericFixture";
 #endif
diff --git a/src/NUnitCore/core/ParameterizedTestMethodSuite.cs b/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
index a3c1d9f..c3ce58f 100644
--- a/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
+++ b/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
@@ -3,6 +3,11 @@
 // This is free software licensed under the NUnit license. You may
 // obtain a copy of the license at http://nunit.org.
 // ****************************************************************
+//#define DEFAULT_APPLIES_TO_TESTCASE
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
 using System.Reflection;
 using System.Text;
 
@@ -15,6 +20,7 @@ namespace NUnit.Core
     public class ParameterizedMethodSuite : TestSuite
     {
         private bool isTheory;
+        private MethodInfo method;
 
         /// <summary>
         /// Construct from a MethodInfo
@@ -25,6 +31,7 @@ namespace NUnit.Core
         {
             this.maintainTestOrder = true;
             this.isTheory = Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true);
+            this.method = method;
         }
 
         /// <summary>
@@ -60,6 +67,10 @@ namespace NUnit.Core
                 }
             }
 
+#if CLR_2_0 || CLR_4_0
+            this.actions = ActionsHelper.GetActionsFromAttributeProvider(this.method);
+#endif
+
             // DYNAMIC: Get the parameters, and add the methods here.
             
             TestResult result = base.Run(listener, filter);
@@ -75,6 +86,9 @@ namespace NUnit.Core
 			this.Fixture = null;
 			this.setUpMethods = null;
 			this.tearDownMethods = null;
+#if CLR_2_0 || CLR_4_0
+            this.actions = null;
+#endif
 
             return result;
         }
@@ -96,5 +110,25 @@ namespace NUnit.Core
         protected override void DoOneTimeTearDown(TestResult suiteResult)
         {
         }
+
+#if CLR_2_0 || CLR_4_0
+#if !DEFAULT_APPLIES_TO_TESTCASE
+        protected override void ExecuteActions(ActionPhase phase)
+        {
+            List<TestAction> targetActions = new List<TestAction>();
+
+            if (this.actions != null)
+            {
+                foreach (var action in this.actions)
+                {
+                    if (action.DoesTarget(TestAction.TargetsSuite))
+                        targetActions.Add(action);
+                }
+            }
+
+            ActionsHelper.ExecuteActions(phase, targetActions, this);
+        }
+#endif
+#endif
     }
 }
diff --git a/src/NUnitCore/core/PlatformHelper.cs b/src/NUnitCore/core/PlatformHelper.cs
index 737f627..157505b 100644
--- a/src/NUnitCore/core/PlatformHelper.cs
+++ b/src/NUnitCore/core/PlatformHelper.cs
@@ -21,7 +21,7 @@ namespace NUnit.Core
 		/// 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,NT6,Win2K,WinXP,Win2003Server,Vista,Win2008Server,Win2008ServerR2,Windows7,Unix,Linux";
+			"Win,Win32,Win32S,Win32NT,Win32Windows,WinCE,Win95,Win98,WinMe,NT3,NT4,NT5,NT6,Win2K,WinXP,Win2003Server,Vista,Win2008Server,Win2008ServerR2,Win2012Server,Windows7,Windows8,Unix,Linux";
 		
 		/// <summary>
 		/// Comma-delimited list of all supported Runtime platform constants
@@ -117,117 +117,97 @@ namespace NUnit.Core
 				return IsPlatformSupported( platform.Split( new char[] { ',' } ) );
 
 			string platformName = platform.Trim();
-			bool nameOK = false;
+            bool isSupported = false;
 
-			string versionSpecification = null;
+            //string versionSpecification = null;
 
-			string[] parts = platformName.Split( new char[] { '-' } );
-			if ( parts.Length == 2 )
-			{
-				platformName = parts[0];
-				versionSpecification = parts[1];
-			}
+            //string[] parts = platformName.Split( new char[] { '-' } );
+            //if ( parts.Length == 2 )
+            //{
+            //    platformName = parts[0];
+            //    versionSpecification = parts[1];
+            //}
 
 			switch( platformName.ToUpper() )
 			{
 				case "WIN":
 				case "WIN32":
-					nameOK = os.IsWindows;
+                    isSupported = os.IsWindows;
 					break;
 				case "WIN32S":
-                    nameOK = os.IsWin32S;
+                    isSupported = os.IsWin32S;
 					break;
 				case "WIN32WINDOWS":
-					nameOK = os.IsWin32Windows;
+                    isSupported = os.IsWin32Windows;
 					break;
 				case "WIN32NT":
-					nameOK = os.IsWin32NT;
+                    isSupported = os.IsWin32NT;
 					break;
 				case "WINCE":
-                    nameOK = os.IsWinCE;
+                    isSupported = os.IsWinCE;
 					break;
 				case "WIN95":
-                    nameOK = os.IsWin95;
+                    isSupported = os.IsWin95;
 					break;
 				case "WIN98":
-                    nameOK = os.IsWin98;
+                    isSupported = os.IsWin98;
 					break;
 				case "WINME":
-					nameOK = os.IsWinME;
+                    isSupported = os.IsWinME;
 					break;
 				case "NT3":
-                    nameOK = os.IsNT3;
+                    isSupported = os.IsNT3;
 					break;
 				case "NT4":
-                    nameOK = os.IsNT4;
+                    isSupported = os.IsNT4;
 					break;
                 case "NT5":
-                    nameOK = os.IsNT5;
+                    isSupported = os.IsNT5;
                     break;
                 case "WIN2K":
-                    nameOK = os.IsWin2K;
+                    isSupported = os.IsWin2K;
 					break;
 				case "WINXP":
-                    nameOK = os.IsWinXP;
+                    isSupported = os.IsWinXP;
 					break;
 				case "WIN2003SERVER":
-                    nameOK = os.IsWin2003Server;
+                    isSupported = os.IsWin2003Server;
 					break;
                 case "NT6":
-                    nameOK = os.IsNT6;
+                    isSupported = os.IsNT6;
                     break;
                 case "VISTA":
-                    nameOK = os.IsVista;
+                    isSupported = os.IsVista;
                     break;
                 case "WIN2008SERVER":
-                    nameOK = os.IsWin2008Server;
+                    isSupported = os.IsWin2008Server;
                     break;
                 case "WIN2008SERVERR2":
-                    nameOK = os.IsWin2008ServerR2;
+                    isSupported = os.IsWin2008ServerR2;
+                    break;
+                case "WIN2012SERVER":
+                    isSupported = os.IsWin2012Server;
+                    break;
+                case "WINDOWS7":
+                    isSupported = os.IsWindows7;
+                    break;
+                case "WINDOWS8":
+                    isSupported = os.IsWindows8;
                     break;
-				case "WINDOWS7":
-					nameOK = os.IsWindows7;
-					break;
                 case "UNIX":
 				case "LINUX":
-                    nameOK = os.IsUnix;
-					break;
-				case "NET":
-					nameOK = rt.Runtime == RuntimeType.Net;
+                    isSupported = os.IsUnix;
 					break;
-				case "NETCF":
-					nameOK = rt.Runtime == RuntimeType.NetCF;
-					break;
-				case "SSCLI":
-				case "ROTOR":
-					nameOK = rt.Runtime == RuntimeType.SSCLI;
-					break;
-				case "MONO":
-                    nameOK = rt.Runtime == RuntimeType.Mono;
-					// Special handling because Mono 1.0 profile has version 1.1
-					if ( versionSpecification == "1.0" )
-						versionSpecification = "1.1";
-					break;
-				default:
-					throw new ArgumentException( "Invalid platform name", platform.ToString() );
-			}
-
-			if ( nameOK ) 
-			{
-				if ( versionSpecification == null )
-					return true;
 
-				Version version = new Version( versionSpecification );
-
-				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;
+                default:
+                    isSupported = IsRuntimeSupported(platformName);
+                    break;
 			}
 
-			this.reason = "Only supported on " + platform;
-			return false;
+            if (!isSupported)
+			    this.reason = "Only supported on " + platform;
+
+			return isSupported;
 		}
 
 		/// <summary>
@@ -239,5 +219,46 @@ namespace NUnit.Core
 		{
 			get { return reason; }
 		}
-	}
+
+        private bool IsRuntimeSupported(string platformName)
+        {
+            string versionSpecification = null;
+            string[] parts = platformName.Split(new char[] { '-' });
+            if (parts.Length == 2)
+            {
+                platformName = parts[0];
+                versionSpecification = parts[1];
+            }
+
+            switch (platformName.ToUpper())
+            {
+                case "NET":
+                    return IsRuntimeSupported(RuntimeType.Net, versionSpecification);
+
+                case "NETCF":
+                    return IsRuntimeSupported(RuntimeType.NetCF, versionSpecification);
+
+                case "SSCLI":
+                case "ROTOR":
+                    return IsRuntimeSupported(RuntimeType.SSCLI, versionSpecification);
+
+                case "MONO":
+                    return IsRuntimeSupported(RuntimeType.Mono, versionSpecification);
+
+                default:
+                    throw new ArgumentException("Invalid platform name", platformName);
+            }
+        }
+
+        private bool IsRuntimeSupported(RuntimeType runtime, string versionSpecification)
+        {
+            Version version = versionSpecification == null
+                ? RuntimeFramework.DefaultVersion
+                : new Version(versionSpecification);
+
+            RuntimeFramework target = new RuntimeFramework(runtime, version);
+
+            return rt.Supports(target);
+        }
+    }
 }
diff --git a/src/NUnitCore/core/ProxyTestRunner.cs b/src/NUnitCore/core/ProxyTestRunner.cs
index f03a4c1..1d7c3e6 100644
--- a/src/NUnitCore/core/ProxyTestRunner.cs
+++ b/src/NUnitCore/core/ProxyTestRunner.cs
@@ -119,35 +119,22 @@ namespace NUnit.Core
 		#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 TestResult Run(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            // Save active listener for derived classes
+            this.listener = listener;
+            return this.testRunner.Run(listener, filter, tracing, logLevel);
+        }
 
-		public virtual void BeginRun( EventListener listener, ITestFilter filter )
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-			this.testRunner.BeginRun( listener, filter );
-		}
+        public virtual void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            // Save active listener for derived classes
+            this.listener = listener;
+            this.testRunner.BeginRun(listener, filter, tracing, logLevel);
+        }
 
-		public virtual TestResult EndRun()
+        public virtual TestResult EndRun()
 		{
 			return this.testRunner.EndRun();
 		}
@@ -161,7 +148,7 @@ namespace NUnit.Core
 		{
 			this.testRunner.Wait();
 		}
-		#endregion
+        #endregion
 
 		#region InitializeLifetimeService Override
 		public override object InitializeLifetimeService()
diff --git a/src/NUnitCore/core/RemoteTestRunner.cs b/src/NUnitCore/core/RemoteTestRunner.cs
index f54e388..01a92a1 100644
--- a/src/NUnitCore/core/RemoteTestRunner.cs
+++ b/src/NUnitCore/core/RemoteTestRunner.cs
@@ -7,9 +7,10 @@
 namespace NUnit.Core
 {
 	using System;
+    using System.Collections;
+    using System.Diagnostics;
     using System.Reflection;
-	using System.Collections;
-	using System.Diagnostics;
+    using System.Threading;
 
 	/// <summary>
 	/// RemoteTestRunner is tailored for use as the initial runner to
@@ -29,7 +30,7 @@ namespace NUnit.Core
 		/// <returns></returns>
         public static RemoteTestRunner CreateInstance(AppDomain targetDomain, int ID)
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
                 targetDomain,
 #else
@@ -52,6 +53,7 @@ namespace NUnit.Core
 		#endregion
 
 		#region Method Overrides
+
 		public override bool Load(TestPackage package)
 		{
 			log.Info("Loading Test Package " + package.Name );
@@ -65,8 +67,12 @@ namespace NUnit.Core
 			bool useThreadedRunner = package.GetSetting( "UseThreadedRunner", true );
 			
 			TestRunner runner = new SimpleTestRunner( this.runnerID );
-			if ( useThreadedRunner )
-				runner = new ThreadedTestRunner( runner );
+            if (useThreadedRunner)
+            {
+                ApartmentState apartmentState = (ApartmentState)package.GetSetting("ApartmentState", ApartmentState.Unknown);
+                ThreadPriority priority = (ThreadPriority)package.GetSetting("ThreadPriority", ThreadPriority.Normal);
+                runner = new ThreadedTestRunner(runner, apartmentState, priority);
+            }
 
 			this.TestRunner = runner;
 
@@ -85,58 +91,60 @@ namespace NUnit.Core
         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 )
+		public override TestResult Run( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
 		{
             log.Debug("Run");
 
             QueuingEventListener queue = new QueuingEventListener();
 
-			StartTextCapture( queue );
+			StartTextCapture( queue, tracing, logLevel );
 
 			using( EventPump pump = new EventPump( listener, queue.Events, true ) )
 			{
 				pump.Start();
-				return base.Run( queue, filter );
+				return base.Run( queue, filter, tracing, logLevel );
 			}
 		}
 
-		public override void BeginRun( EventListener listener )
-		{
-			BeginRun( listener, TestFilter.Empty );
-		}
-
-		public override void BeginRun( EventListener listener, ITestFilter filter )
+		public override void BeginRun( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
 		{
             log.Debug("BeginRun");
 
 			QueuingEventListener queue = new QueuingEventListener();
 
-			StartTextCapture( queue );
+			StartTextCapture( queue, tracing, logLevel );
 
 			EventPump pump = new EventPump( listener, queue.Events, true);
 			pump.Start(); // Will run till RunFinished is received
 			// TODO: Make sure the thread is cleaned up if we abort the run
 		
-			base.BeginRun( queue, filter );
+			base.BeginRun( queue, filter, tracing, logLevel );
 		}
 
-		private void StartTextCapture( EventListener queue )
+		private void StartTextCapture( EventListener queue, bool tracing, LoggingThreshold logLevel )
 		{
             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;
-		}
+
+            TestExecutionContext.CurrentContext.Tracing = false;
+            if (tracing)
+            {
+                TestExecutionContext.CurrentContext.TraceWriter = new EventListenerTextWriter(queue, TestOutputType.Trace);
+                TestExecutionContext.CurrentContext.Tracing = true;
+            }
+
+            TestExecutionContext.CurrentContext.LogLevel = LoggingThreshold.Off;
+            if (logLevel != LoggingThreshold.Off)
+            {
+                TestExecutionContext.CurrentContext.LogWriter = new EventListenerTextWriter(queue, TestOutputType.Log);
+                TestExecutionContext.CurrentContext.LogLevel = logLevel;
+            }
+        }
+
 		#endregion
 
 		private void CurrentDomain_DomainUnload(object sender, EventArgs e)
diff --git a/src/NUnitCore/core/SetUpFixture.cs b/src/NUnitCore/core/SetUpFixture.cs
index 90710f1..e1830c6 100644
--- a/src/NUnitCore/core/SetUpFixture.cs
+++ b/src/NUnitCore/core/SetUpFixture.cs
@@ -28,6 +28,10 @@ namespace NUnit.Core
             
 			this.fixtureSetUpMethods = Reflect.GetMethodsWithAttribute( type, NUnitFramework.SetUpAttribute, true );
 			this.fixtureTearDownMethods = Reflect.GetMethodsWithAttribute( type, NUnitFramework.TearDownAttribute, true );
+
+#if CLR_2_0 || CLR_4_0
+		    this.actions = ActionsHelper.GetActionsFromTypesAttributes(type);
+#endif
 		}
 		#endregion
 
diff --git a/src/NUnitCore/core/SimpleTestRunner.cs b/src/NUnitCore/core/SimpleTestRunner.cs
index e631648..1cd07f2 100644
--- a/src/NUnitCore/core/SimpleTestRunner.cs
+++ b/src/NUnitCore/core/SimpleTestRunner.cs
@@ -112,6 +112,7 @@ namespace NUnit.Core
 			if ( test == null ) return false;
 
 			test.SetRunnerID( this.runnerID, true );
+            TestExecutionContext.CurrentContext.TestPackage = package;
 			return true;
 		}
 
@@ -133,12 +134,8 @@ namespace NUnit.Core
 		#endregion
 
 		#region Methods for Running Tests
-		public virtual TestResult Run( EventListener listener )
-		{
-			return Run( listener, TestFilter.Empty );
-		}
 
-		public virtual TestResult Run( EventListener listener, ITestFilter filter )
+		public virtual TestResult Run( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
 		{
 			try
 			{
@@ -171,17 +168,12 @@ namespace NUnit.Core
 			}
 		}
 
-		public void BeginRun( EventListener listener )
-		{
-			testResult = this.Run( listener );
-		}
-
-		public void BeginRun( EventListener listener, ITestFilter filter )
-		{
-			testResult = this.Run( listener, filter );
-		}
+        public void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            testResult = this.Run(listener, filter, tracing, logLevel);
+        }
 
-		public virtual TestResult EndRun()
+        public virtual TestResult EndRun()
 		{
 			return TestResult;
 		}
@@ -198,20 +190,10 @@ namespace NUnit.Core
 			if (this.runThread != null)
 			{
 				// Cancel Synchronous run only if on another thread
-				if ( runThread == Thread.CurrentThread )
+				if ( this.runThread == Thread.CurrentThread )
 					throw new InvalidOperationException( "May not CancelRun on same thread that is running the test" );
 
-				// Make a copy of runThread, which will be set to 
-				// null when the thread terminates.
-				Thread cancelThread = this.runThread;
-
-				// Tell the thread to abort
-				this.runThread.Abort();
-				
-				// Wake up the thread if necessary
-				// Figure out if we need to do an interupt
-				if ( (cancelThread.ThreadState & ThreadState.WaitSleepJoin ) != 0 )
-					cancelThread.Interrupt();
+                ThreadUtility.Kill(this.runThread);
 			}
 		}
 		#endregion
diff --git a/src/NUnitCore/core/TestAction.cs b/src/NUnitCore/core/TestAction.cs
new file mode 100644
index 0000000..8d69d80
--- /dev/null
+++ b/src/NUnitCore/core/TestAction.cs
@@ -0,0 +1,96 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+
+namespace NUnit.Core
+{
+    public class TestAction
+    {
+        public static readonly int TargetsDefault = 0;
+        public static readonly int TargetsTest = 1;
+        public static readonly int TargetsSuite = 2;
+
+        private static readonly Type _ActionInterfaceType = null;
+        private static readonly Type _TestDetailsClassType = null;
+
+        static TestAction()
+        {
+            _ActionInterfaceType = Type.GetType(NUnitFramework.TestActionInterface);
+            _TestDetailsClassType = Type.GetType(NUnitFramework.TestDetailsClass);
+        }
+
+        private readonly object _Action;
+        private readonly int _Targets;
+
+        public TestAction(object action)
+        {
+            if (action == null)
+                throw new ArgumentNullException("action");
+
+            _Action = action;
+            _Targets = (int) Reflect.GetPropertyValue(action, "Targets");
+        }
+
+        public void ExecuteBefore(ITest test)
+        {
+            Execute(test, "Before");
+        }
+
+        public void ExecuteAfter(ITest test)
+        {
+            Execute(test, "After");
+        }
+
+        private void Execute(ITest test, string methodPrefix)
+        {
+            var method = Reflect.GetNamedMethod(_ActionInterfaceType, methodPrefix + "Test");
+            var details = CreateTestDetails(test);
+
+            Reflect.InvokeMethod(method, _Action, details);
+        }
+
+        private static object CreateTestDetails(ITest test)
+        {
+            object fixture = null;
+            MethodInfo method = null;
+
+            var testMethod = test as TestMethod;
+            if (testMethod != null)
+                method = testMethod.Method;
+
+            var testObject = test as Test;
+            if(testObject != null)
+                fixture = testObject.Fixture;
+
+            return Activator.CreateInstance(_TestDetailsClassType,
+                                            fixture,
+                                            method,
+                                            test.TestName.FullName,
+                                            test.TestType,
+                                            test.IsSuite);
+        }
+
+        public bool DoesTarget(int target)
+        {
+            if(target < 0)
+                throw new ArgumentOutOfRangeException("target", "Target must be a positive integer.");
+
+            if(target == 0)
+                return _Targets == 0;
+
+            uint self = Convert.ToUInt32(target);
+            return (_Targets & self) == self;
+        }
+
+        public int Targets { get { return _Targets; } }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/core/TestAssembly.cs b/src/NUnitCore/core/TestAssembly.cs
index 4e3816f..e78abf7 100644
--- a/src/NUnitCore/core/TestAssembly.cs
+++ b/src/NUnitCore/core/TestAssembly.cs
@@ -5,6 +5,7 @@
 // ****************************************************************
 
 using System;
+using System.Reflection;
 
 namespace NUnit.Core
 {
@@ -18,7 +19,12 @@ namespace NUnit.Core
         /// Initializes a new instance of the <see cref="TestAssembly"/> class.
         /// </summary>
         /// <param name="path">The path.</param>
-        public TestAssembly(string path) : base(path) { }
+        public TestAssembly(Assembly assembly, string path) : base(path)
+        {
+#if CLR_2_0 || CLR_4_0
+            this.actions = ActionsHelper.GetActionsFromAttributeProvider(assembly);
+#endif
+        }
 
         /// <summary>
         /// Gets the type of the test.
diff --git a/src/NUnitCore/core/TestExecutionContext.cs b/src/NUnitCore/core/TestExecutionContext.cs
index 11b3b8f..693fa96 100644
--- a/src/NUnitCore/core/TestExecutionContext.cs
+++ b/src/NUnitCore/core/TestExecutionContext.cs
@@ -29,10 +29,12 @@ namespace NUnit.Core
 	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
@@ -45,7 +47,7 @@ namespace NUnit.Core
         /// <summary>
         /// Indicates whether logging is enabled
         /// </summary>
-        private bool logging;
+        //private bool logging;
 
         /// <summary>
         /// Destination for standard output
@@ -100,6 +102,11 @@ namespace NUnit.Core
         private TestResult currentResult;
 
         /// <summary>
+        /// The TestPackage being executed
+        /// </summary>
+        private TestPackage testPackage;
+
+        /// <summary>
         /// Link to a prior saved context
         /// </summary>
         public TestExecutionContext prior;
@@ -115,7 +122,7 @@ namespace NUnit.Core
         {
             this.prior = null;
             this.tracing = false;
-            this.logging = false;
+            //this.logging = false;
             this.outWriter = Console.Out;
             this.errorWriter = Console.Error;
             this.traceWriter = null;
@@ -136,7 +143,7 @@ namespace NUnit.Core
         {
             this.prior = other;
             this.tracing = other.tracing;
-            this.logging = other.logging;
+            //this.logging = other.logging;
             this.outWriter = other.outWriter;
             this.errorWriter = other.errorWriter;
             this.traceWriter = other.traceWriter;
@@ -145,6 +152,7 @@ namespace NUnit.Core
 
             this.currentTest = other.currentTest;
             this.currentResult = other.currentResult;
+            this.testPackage = other.testPackage;
 
             this.currentDirectory = Environment.CurrentDirectory;
             this.currentCulture = CultureInfo.CurrentCulture;
@@ -192,15 +200,6 @@ namespace NUnit.Core
         }
 
         /// <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
@@ -272,6 +271,12 @@ namespace NUnit.Core
             set { logCapture.Writer = value; }
         }
 
+        public LoggingThreshold LogLevel
+        {
+            get { return logCapture.Threshold; }
+            set { logCapture.Threshold = value; }
+        }
+
         private void StopTracing()
         {
             traceWriter.Close();
@@ -336,7 +341,7 @@ namespace NUnit.Core
         }
 
         /// <summary>
-        /// Gets or sets the test case timeout vaue
+        /// Gets or sets the test case timeout value
         /// </summary>
         public int TestCaseTimeout
         {
@@ -362,6 +367,15 @@ namespace NUnit.Core
             set { currentResult = value; }
         }
 
+        /// <summary>
+        /// Gets the test package currently being run
+        /// </summary>
+        public TestPackage TestPackage
+        {
+            get { return testPackage; }
+            set { testPackage = value; }
+        }
+
         #endregion
 
         #region Static Methods
diff --git a/src/NUnitCore/core/TestMethod.cs b/src/NUnitCore/core/TestMethod.cs
index 9036a7e..ace6866 100644
--- a/src/NUnitCore/core/TestMethod.cs
+++ b/src/NUnitCore/core/TestMethod.cs
@@ -3,6 +3,7 @@
 // may obtain a copy of the license as well as information regarding
 // copyright ownership at http://nunit.org.
 // ****************************************************************
+//#define DEFAULT_APPLIES_TO_TESTCASE
 
 namespace NUnit.Core
 {
@@ -14,6 +15,10 @@ namespace NUnit.Core
 	using System.Text.RegularExpressions;
 	using System.Reflection;
 
+#if CLR_2_0 || CLR_4_0
+    using System.Collections.Generic;
+#endif
+
 	/// <summary>
 	/// The TestMethod class represents a Test implemented as a method.
 	/// 
@@ -44,6 +49,18 @@ namespace NUnit.Core
 		/// </summary>
 		protected MethodInfo[] tearDownMethods;
 
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// The actions
+        /// </summary>
+	    protected TestAction[] actions;
+
+        /// <summary>
+        /// The parent suite's actions
+        /// </summary>
+        protected TestAction[] suiteActions;
+#endif
+
         /// <summary>
         /// The ExpectedExceptionProcessor for this test, if any
         /// </summary>
@@ -220,12 +237,19 @@ namespace NUnit.Core
                 {
                     this.setUpMethods = suite.GetSetUpMethods();
                     this.tearDownMethods = suite.GetTearDownMethods();
+#if CLR_2_0 || CLR_4_0
+                    this.suiteActions = suite.GetTestActions();
+#endif
                 }
             }
 
             try
             {
-                // Temporary... to allow for tests that directly execute a test case
+#if CLR_2_0 || CLR_4_0
+                this.actions = ActionsHelper.GetActionsFromAttributeProvider(method);
+#endif
+
+                // Temporary... to allow for tests that directly execute a test case);
                 if (Fixture == null && !method.IsStatic)
                     Fixture = Reflect.Construct(this.FixtureType);
 
@@ -255,7 +279,6 @@ namespace NUnit.Core
             {
                 Fixture = null;
 
-                CallContext.FreeNamedDataSlot("NUnit.Framework.TestContext");
                 TestExecutionContext.Restore();
             }
 		}
@@ -300,9 +323,12 @@ namespace NUnit.Core
 			TestResult testResult = new TestResult(this);
 			TestExecutionContext.CurrentContext.CurrentResult =  testResult;
 			
-			try 
+			try
 			{
                 RunSetUp();
+#if CLR_2_0 || CLR_4_0
+			    RunBeforeActions(testResult);
+#endif
 
 				RunTestCase( testResult );
 			}
@@ -317,6 +343,9 @@ namespace NUnit.Core
 			}
 			finally 
 			{
+#if CLR_2_0 || CLR_4_0
+                RunAfterActions(testResult);
+#endif
 				RunTearDown( testResult );
 
 				DateTime stop = DateTime.Now;
@@ -354,7 +383,59 @@ namespace NUnit.Core
 
 		#region Invoke Methods by Reflection, Recording Errors
 
-        private void RunSetUp()
+#if CLR_2_0 || CLR_4_0
+
+        protected virtual void ExecuteActions(ActionPhase phase)
+        {
+            List<TestAction> targetActions = new List<TestAction>();
+
+            if (this.suiteActions != null)
+            {
+                foreach (var action in this.suiteActions)
+                {
+                    if(action.DoesTarget(TestAction.TargetsTest))
+                        targetActions.Add(action);
+                }
+            }
+
+            if (this.actions != null)
+            {
+                foreach (var action in this.actions)
+                {
+#if DEFAULT_APPLIES_TO_TESTCASE
+                    if (!(Parent is ParameterizedMethodSuite) && (action.DoesTarget(TestAction.TargetsDefault) || action.DoesTarget(TestAction.TargetsTest)))
+#else
+                    if (action.DoesTarget(TestAction.TargetsDefault) || (!(Parent is ParameterizedMethodSuite) && action.DoesTarget(TestAction.TargetsTest)))
+#endif
+                        targetActions.Add(action);
+                }
+            }
+
+            ActionsHelper.ExecuteActions(phase, targetActions, this);
+        }
+
+        private void RunBeforeActions(TestResult testResult)
+        {
+            ExecuteActions(ActionPhase.Before);
+        }
+
+        private void RunAfterActions(TestResult testResult)
+        {
+            try
+            {
+                ExecuteActions(ActionPhase.After);
+            }
+            catch (Exception ex)
+            {
+                if (ex is NUnitException)
+                    ex = ex.InnerException;
+                // TODO: What about ignore exceptions in teardown?
+                testResult.Error(ex, FailureSite.TearDown);
+            }
+        }
+#endif
+
+	    private void RunSetUp()
         {
             if (setUpMethods != null)
                 foreach( MethodInfo setUpMethod in setUpMethods )
@@ -376,8 +457,8 @@ namespace NUnit.Core
 			{
 				if ( ex is NUnitException )
 					ex = ex.InnerException;
-				// TODO: What about ignore exceptions in teardown?
-				testResult.Error( ex,FailureSite.TearDown );
+
+                RecordException(ex, testResult, FailureSite.TearDown);
 			}
 		}
 
@@ -421,43 +502,13 @@ namespace NUnit.Core
             if (exception is NUnitException)
                 exception = exception.InnerException;
 
-            testResult.SetResult(NUnitFramework.GetResultState(exception), exception, failureSite);
+            // Ensure that once a test is cancelled, it stays cancelled
+            ResultState finalResultState = testResult.ResultState == ResultState.Cancelled
+                ? ResultState.Cancelled
+                : NUnitFramework.GetResultState(exception);
+
+            testResult.SetResult(finalResultState, exception, failureSite);
 		}
 		#endregion
-
-        #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 c88bfdb..c36de79 100644
--- a/src/NUnitCore/core/TestRunnerThread.cs
+++ b/src/NUnitCore/core/TestRunnerThread.cs
@@ -36,10 +36,19 @@ namespace NUnit.Core
 		private NUnit.Core.EventListener listener;
 
 		/// <summary>
-		/// Array of test names for ues by the thread proc
-		/// </summary>
+		/// The Test filter used in selecting the tests
 		//private string[] testNames;
 		private ITestFilter filter;
+
+        /// <summary>
+        /// Indicates whether trace output should be captured
+        /// </summary>
+        private bool tracing;
+
+        /// <summary>
+        /// The logging threshold for which output should be captured
+        /// </summary>
+        private LoggingThreshold logLevel;
 			
 		/// <summary>
 		/// Array of returned results
@@ -70,18 +79,18 @@ namespace NUnit.Core
 
 		#region Constructor
 
-		public TestRunnerThread( TestRunner runner ) 
+		public TestRunnerThread( TestRunner runner, ApartmentState apartmentState, ThreadPriority priority ) 
 		{ 
 			this.runner = runner;
 			this.thread = new Thread( new ThreadStart( TestRunnerThreadProc ) );
 			thread.IsBackground = true;
 			thread.Name = "TestRunnerThread";
-            thread.Priority = NUnitConfiguration.ThreadPriority;
-            if (NUnitConfiguration.ApartmentState != ApartmentState.Unknown)
-#if NET_2_0
-                thread.SetApartmentState(NUnitConfiguration.ApartmentState);
+            thread.Priority = priority;
+            if (apartmentState != ApartmentState.Unknown)
+#if CLR_2_0 || CLR_4_0
+                thread.SetApartmentState(apartmentState);
 #else
-                thread.ApartmentState = NUnitConfiguration.ApartmentState;
+                thread.ApartmentState = apartmentState;
 #endif
 		}
 
@@ -97,25 +106,18 @@ namespace NUnit.Core
 
 		public void Cancel()
 		{
-			this.thread.Abort(); // Request abort first
-
-			// Wake up the thread if necessary
-			if ( ( this.thread.ThreadState & ThreadState.WaitSleepJoin ) != 0 )
-				this.thread.Interrupt();
+            ThreadUtility.Kill(this.thread);
 		}
 
-		public void StartRun( EventListener listener )
-		{
-			StartRun( listener, TestFilter.Empty );
-		}
-
-		public void StartRun( EventListener listener, ITestFilter filter )
-		{
-			this.listener = listener;
-			this.filter = filter;
+        public void StartRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            this.listener = listener;
+            this.filter = filter;
+            this.tracing = tracing;
+            this.logLevel = logLevel;
 
-			thread.Start();
-		}
+            thread.Start();
+        }
 
 		#endregion
 
@@ -127,7 +129,7 @@ namespace NUnit.Core
 		{
             try
             {
-                results = new TestResult[] { runner.Run(this.listener, this.filter) };
+                results = new TestResult[] { runner.Run(this.listener, this.filter, this.tracing, this.logLevel) };
             }
             catch (Exception ex)
             {
diff --git a/src/NUnitCore/core/TestSuite.cs b/src/NUnitCore/core/TestSuite.cs
index 98ad6a9..5835719 100644
--- a/src/NUnitCore/core/TestSuite.cs
+++ b/src/NUnitCore/core/TestSuite.cs
@@ -4,6 +4,7 @@
 // copyright ownership at http://nunit.org.
 // ****************************************************************
 
+
 namespace NUnit.Core
 {
 	using System;
@@ -13,6 +14,10 @@ namespace NUnit.Core
 	using System.Reflection;
 	using NUnit.Core.Filters;
 
+#if CLR_2_0 || CLR_4_0
+    using System.Collections.Generic;
+#endif
+
 	/// <summary>
 	/// Summary description for TestSuite.
 	/// </summary>
@@ -48,6 +53,13 @@ namespace NUnit.Core
         /// </summary>
         protected MethodInfo[] tearDownMethods;
 
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// The actions for this suite
+        /// </summary>
+	    protected TestAction[] actions;
+#endif
+
         /// <summary>
         /// Set to true to suppress sorting this suite's contents
         /// </summary>
@@ -187,6 +199,27 @@ namespace NUnit.Core
         {
             return tearDownMethods;
         }
+
+#if CLR_2_0 || CLR_4_0
+        internal virtual TestAction[] GetTestActions()
+        {
+            List<TestAction> allActions = new List<TestAction>();
+
+            if (this.Parent != null && this.Parent is TestSuite)
+            {
+                TestAction[] parentActions = ((TestSuite)this.Parent).GetTestActions();
+
+                if (parentActions != null)
+                    allActions.AddRange(parentActions);
+            }
+
+            if (this.actions != null)
+                allActions.AddRange(this.actions);
+
+            return allActions.ToArray();
+        }
+#endif
+
         #endregion
 
 		#region Test Overrides
@@ -269,6 +302,9 @@ namespace NUnit.Core
 			TestResult suiteResult = new TestResult(this);
 			
             DoOneTimeSetUp(suiteResult);
+#if CLR_2_0 || CLR_4_0
+            DoOneTimeBeforeTestSuiteActions(suiteResult);
+#endif
 
             if (this.Properties["_SETCULTURE"] != null)
                 TestExecutionContext.CurrentContext.CurrentCulture =
@@ -294,6 +330,9 @@ namespace NUnit.Core
                     }
                     finally
                     {
+#if CLR_2_0 || CLR_4_0
+                        DoOneTimeAfterTestSuiteActions(suiteResult);
+#endif
                         DoOneTimeTearDown(suiteResult);
                     }
                     break;
@@ -342,6 +381,53 @@ namespace NUnit.Core
             }
         }
 
+#if CLR_2_0 || CLR_4_0
+
+        protected virtual void ExecuteActions(ActionPhase phase)
+        {
+            List<TestAction> targetActions = new List<TestAction>();
+
+            if (this.actions != null)
+            {
+                foreach (var action in this.actions)
+                {
+                    if (action.DoesTarget(TestAction.TargetsSuite) || action.DoesTarget(TestAction.TargetsDefault))
+                        targetActions.Add(action);
+                }
+            }
+
+            ActionsHelper.ExecuteActions(phase, targetActions, this);
+        }
+
+        protected virtual void DoOneTimeBeforeTestSuiteActions(TestResult suiteResult)
+        {
+            try
+            {
+                ExecuteActions(ActionPhase.Before);
+                TestExecutionContext.CurrentContext.Update();
+            }
+            catch (Exception ex)
+            {
+                if (ex is NUnitException || ex is System.Reflection.TargetInvocationException)
+                    ex = ex.InnerException;
+
+                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);
+            }
+        }
+#endif
+
 		protected virtual void CreateUserFixture()
 		{
             if (arguments != null && arguments.Length > 0)
@@ -387,6 +473,27 @@ namespace NUnit.Core
             }
         }
 
+#if CLR_2_0 || CLR_4_0
+        protected virtual void DoOneTimeAfterTestSuiteActions(TestResult suiteResult)
+        {
+            try
+            {
+                ExecuteActions(ActionPhase.After);
+            }
+            catch (Exception ex)
+            {
+                // Error in TestFixtureTearDown or Dispose causes the
+                // suite to be marked as a failure, even if
+                // all the contained tests passed.
+                NUnitException nex = ex as NUnitException;
+                if (nex != null)
+                    ex = nex.InnerException;
+
+                suiteResult.Failure(ex.Message, ex.StackTrace, FailureSite.TearDown);
+            }
+        }
+#endif
+
         protected virtual bool IsAssertException(Exception ex)
         {
             return ex.GetType().FullName == NUnitFramework.AssertException;
@@ -412,6 +519,9 @@ namespace NUnit.Core
             if (Properties.Contains("Timeout"))
                 TestExecutionContext.CurrentContext.TestCaseTimeout = (int)Properties["Timeout"];
 
+            IDictionary settings = TestExecutionContext.CurrentContext.TestPackage.Settings;
+            bool stopOnError = settings.Contains("StopOnError") && (bool)settings["StopOnError"];
+
             foreach (Test test in ArrayList.Synchronized(Tests))
             {
                 if (filter.Pass(test))
@@ -440,6 +550,9 @@ namespace NUnit.Core
 
                     if (result.ResultState == ResultState.Cancelled)
                         break;
+
+                    if ((result.IsError || result.IsFailure) && stopOnError)
+                        break;
                 }
             }
 		}
@@ -480,7 +593,7 @@ namespace NUnit.Core
                 listener.SuiteStarted(test.TestName);
                 TestResult result = new TestResult( new TestInfo(test) );
 				result.SetResult( resultState, ignoreReason, null );
-                MarkTestsNotRun(test.Tests, resultState, ignoreReason, suiteResult, listener, filter);
+                MarkTestsNotRun(test.Tests, resultState, ignoreReason, result, listener, filter);
                 suiteResult.AddResult(result);
                 listener.SuiteFinished(result);
             }
@@ -509,9 +622,12 @@ namespace NUnit.Core
             {
                 listener.SuiteStarted(test.TestName);
                 TestResult result = new TestResult( new TestInfo(test) );
-				string msg = string.Format( "Parent SetUp failed in {0}", this.FixtureType.Name );
+				string msg = this.FixtureType == null
+                    ? "Parent SetUp failed"
+                    : string.Format( "Parent SetUp failed in {0}", this.FixtureType.Name );
+
 				result.Failure(msg, null, FailureSite.Parent);
-                MarkTestsFailed(test.Tests, suiteResult, listener, filter);
+                MarkTestsFailed(test.Tests, result, listener, filter);
                 suiteResult.AddResult(result);
                 listener.SuiteFinished(result);
             }
@@ -519,7 +635,9 @@ namespace NUnit.Core
             {
                 listener.TestStarted(test.TestName);
                 TestResult result = new TestResult( new TestInfo(test) );
-				string msg = string.Format( "TestFixtureSetUp failed in {0}", this.FixtureType.Name );
+				string msg = this.FixtureType == null
+                    ? "TestFixtureSetUp failed"
+                    : string.Format( "TestFixtureSetUp failed in {0}", this.FixtureType.Name );
 				result.Failure(msg, null, FailureSite.Parent);
 				suiteResult.AddResult(result);
                 listener.TestFinished(result);
diff --git a/src/NUnitCore/core/TestThread.cs b/src/NUnitCore/core/TestThread.cs
index b660505..b6f088f 100644
--- a/src/NUnitCore/core/TestThread.cs
+++ b/src/NUnitCore/core/TestThread.cs
@@ -37,7 +37,7 @@ namespace NUnit.Core
 
         protected ITestFilter filter;
 		
-		protected TestMethod.ContextDictionary contextDictionary;
+		protected ContextDictionary contextDictionary;
 
         /// <summary>
         /// Unexpected exception thrown by test thread
@@ -63,7 +63,7 @@ namespace NUnit.Core
         #region Properties
         public ApartmentState ApartmentState
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             get { return thread.GetApartmentState(); }
             set { thread.SetApartmentState(value); }
 #else
@@ -91,7 +91,7 @@ namespace NUnit.Core
             this.thrownException = null;
             this.listener = listener;
             this.filter = filter;
-			this.contextDictionary = (TestMethod.ContextDictionary)CallContext.GetData("NUnit.Framework.TestContext");
+			this.contextDictionary = (ContextDictionary)CallContext.GetData("NUnit.Framework.TestContext");
 
             log.Debug("Starting test in separate thread");
             thread.Start();
@@ -101,8 +101,16 @@ namespace NUnit.Core
             if (thread.IsAlive)
             {
 				log.Debug("Test timed out - aborting thread");
-                thread.Abort();
-                //thread.Join();
+                ThreadUtility.Kill(thread);
+
+                // NOTE: Without the use of Join, there is a race condition here.
+                // The thread sets the result to Cancelled and our code below sets
+                // it to Failure. In order for the result to be shown as a failure,
+                // we need to ensure that the following code executes after the
+                // thread has terminated. There is a risk here: the test code might
+                // refuse to terminate. However, it's more important to deal with
+                // the normal rather than a pathological case.
+                thread.Join();
                 testResult.Failure(string.Format("Test exceeded Timeout value of {0}ms", Timeout), null);
             }
 			else if (thrownException != null)
diff --git a/src/NUnitCore/core/TextCapture.cs b/src/NUnitCore/core/TextCapture.cs
index d4d2c2e..219ebd7 100644
--- a/src/NUnitCore/core/TextCapture.cs
+++ b/src/NUnitCore/core/TextCapture.cs
@@ -14,81 +14,29 @@ namespace NUnit.Core
     /// </summary>
     public abstract class TextCapture
     {
-        #region Private Fields
-        /// <summary>
-        /// True if capture is enabled
-        /// </summary>
-        private bool enabled;
-
-        /// <summary>
-        /// The TextWriter to which text is redirected
-        /// </summary>
-        private TextWriter writer;
-        #endregion
-
-        #region Properties
-        /// <summary>
-        /// The TextWriter to which text is redirected
-        /// </summary>
-        public TextWriter Writer
-        {
-            get { return writer; }
-            set
-            {
-                writer = value;
-
-                if (writer != null && enabled)
-                    StartCapture();
-            }
-        }
+        #region Abstract Members
 
         /// <summary>
-        /// Controls whether text is captured or not
+        /// Gets or sets the TextWriter to which text is redirected
+        /// when captured. The value may only be changed when the
+        /// logging threshold is set to "Off"
         /// </summary>
-        public bool Enabled
-        {
-            get { return enabled; }
-            set
-            {
-                if (enabled != value)
-                {
-                    if (writer != null && enabled)
-                        StopCapture();
-
-                    enabled = value;
-
-                    if (writer != null && enabled && DefaultThreshold != "Off")
-                        StartCapture();
-                }
-            }
+        public abstract TextWriter Writer 
+        { 
+            get; set; 
         }
 
         /// <summary>
-        /// Returns the default threshold value, which represents
-        /// the degree of verbosity of the output text stream.
-        /// Returns "None" in the base class. Derived classes that
-        /// support verbosity levels should override it.
+        /// Gets or sets the capture threshold value, which represents
+        /// the degree of verbosity of the output text stream. Derived
+        /// classes will need to translate the LoggingThreshold into
+        /// the appropriate levels supported by the logging software.
         /// </summary>
-        public virtual string DefaultThreshold
+        public abstract LoggingThreshold Threshold
         {
-            get { return "None"; }
+            get; set;
         }
-        #endregion
 
-        #region Abstract Members
-        /// <summary>
-        /// Override this to perform whatever actions are needed
-        /// to start capturing text and sending it to the Writer.
-        /// </summary>
-        protected abstract void StartCapture();
-
-        /// <summary>
-        /// Override this to perform whatever actions are needed
-        /// to flush remaining output and stop capturing text.
-        /// The Writer should not be changed, allowing capture
-        /// to be restarted at a future point.
-        /// </summary>
-        protected abstract void StopCapture();
         #endregion
     }
 
diff --git a/src/NUnitCore/core/ThreadUtility.cs b/src/NUnitCore/core/ThreadUtility.cs
new file mode 100644
index 0000000..62a1b5c
--- /dev/null
+++ b/src/NUnitCore/core/ThreadUtility.cs
@@ -0,0 +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.
+// ****************************************************************
+
+using System;
+using System.Threading;
+
+namespace NUnit.Core
+{
+    public class ThreadUtility
+    {
+        /// <summary>
+        /// Do our best to Kill a thread
+        /// </summary>
+        /// <param name="thread">The thread to kill</param>
+        public static void Kill(Thread thread)
+        {
+            Kill(thread, null);
+        }
+
+        /// <summary>
+        /// Do our best to kill a thread, passing state info
+        /// </summary>
+        /// <param name="thread">The thread to kill</param>
+        /// <param name="stateInfo">Info for the ThreadAbortException handler</param>
+        public static void Kill(Thread thread, object stateInfo)
+        {
+            try
+            {
+                if (stateInfo == null)
+                    thread.Abort();
+                else
+                    thread.Abort(stateInfo);
+            }
+            catch (ThreadStateException)
+            {
+                // This is deprecated but still needed in this case
+                // in order to kill the thread. The warning can't
+                // be disabled because the #pragma directive is not
+                // recognized by the .NET 1.1 compiler.
+                thread.Resume();
+            }
+
+            if ( (thread.ThreadState & ThreadState.WaitSleepJoin) != 0 )
+                thread.Interrupt();
+        }
+
+        private ThreadUtility() { }
+    }
+}
diff --git a/src/NUnitCore/core/ThreadedTestRunner.cs b/src/NUnitCore/core/ThreadedTestRunner.cs
index 78d8686..3685917 100644
--- a/src/NUnitCore/core/ThreadedTestRunner.cs
+++ b/src/NUnitCore/core/ThreadedTestRunner.cs
@@ -18,48 +18,49 @@ namespace NUnit.Core
         static Logger log = InternalTrace.GetLogger(typeof(ThreadedTestRunner));
 
 		#region Instance Variables
+
 		private TestRunnerThread testRunnerThread;
+        private ApartmentState apartmentState;
+        private ThreadPriority priority;
+
 		#endregion
 
-		#region Constructors
-		public ThreadedTestRunner( TestRunner testRunner ) : base ( testRunner ) { }
+		#region Constructor
+
+        public ThreadedTestRunner(TestRunner testRunner) 
+            : this(testRunner, ApartmentState.Unknown, ThreadPriority.Normal) { }
+
+        public ThreadedTestRunner(TestRunner testRunner, ApartmentState apartmentState, ThreadPriority priority)
+            : base(testRunner)
+        {
+            this.apartmentState = apartmentState;
+            this.priority = priority;
+        }
+
 		#endregion
 
 		#region Overrides
-		public override TestResult Run( EventListener listener )
-		{
-			BeginRun( listener );
-			return EndRun();
-		}
-
-		public override TestResult Run( EventListener listener, ITestFilter filter )
-		{
-			BeginRun( listener, filter );
-			return EndRun();
-		}
 
-		public override void BeginRun( EventListener listener )
-		{
-            log.Info("BeginRun");
-   			testRunnerThread = new TestRunnerThread( this.TestRunner );
-            testRunnerThread.StartRun( listener );
-		}
+        public override TestResult Run(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            BeginRun(listener, filter, tracing, logLevel);
+            return EndRun();
+        }
 
-		public override void BeginRun( EventListener listener, ITestFilter filter )
-		{
+        public override void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
             log.Info("BeginRun");
-            testRunnerThread = new TestRunnerThread(this.TestRunner);
-			testRunnerThread.StartRun( listener, filter );
-		}
+            testRunnerThread = new TestRunnerThread(this.TestRunner, this.apartmentState, this.priority);
+            testRunnerThread.StartRun(listener, filter, tracing, logLevel);
+        }
 
-		public override TestResult EndRun()
+        public override TestResult EndRun()
 		{
             log.Info("EndRun");
             this.Wait();
 			return this.TestRunner.TestResult;
 		}
 
-
 		public override void Wait()
 		{
 			if ( testRunnerThread != null )
diff --git a/src/NUnitCore/core/TypeHelper.cs b/src/NUnitCore/core/TypeHelper.cs
index 375e376..9aaacfd 100644
--- a/src/NUnitCore/core/TypeHelper.cs
+++ b/src/NUnitCore/core/TypeHelper.cs
@@ -15,7 +15,7 @@ namespace NUnit.Core
     {
         public static string GetDisplayName(Type type)
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             if (type.IsGenericParameter)
                 return type.Name;
 
@@ -160,7 +160,7 @@ namespace NUnit.Core
                     type == typeof(sbyte);
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         public static Type MakeGenericType(Type type, Type[] typeArgs)
         {
             // TODO: Add error handling
diff --git a/src/NUnitCore/core/nunit.core.build b/src/NUnitCore/core/nunit.core.build
index 6cf2a2e..a4d6b59 100644
--- a/src/NUnitCore/core/nunit.core.build
+++ b/src/NUnitCore/core/nunit.core.build
@@ -3,10 +3,12 @@
 
   <patternset id="source-files">
     <include name="AbstractTestCaseDecoration.cs"/>
+    <include name="ActionsHelper.cs" />
     <include name="AssemblyInfo.cs"/>
     <include name="AssemblyHelper.cs"/>
     <include name="AssemblyReader.cs"/>
     <include name="AssemblyResolver.cs"/>
+    <include name="ContextDictionary.cs"/>
     <include name="CoreExtensions.cs"/>
     <include name="CultureDetector.cs"/>
     <include name="DirectorySwapper.cs"/>
@@ -24,7 +26,6 @@
     <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"/>
@@ -48,6 +49,7 @@
     <include name="SimpleTestRunner.cs"/>
     <include name="StringTextWriter.cs"/>
     <include name="SuiteBuilderAttribute.cs"/>
+    <include name="TestAction.cs"/>
     <include name="TestAssembly.cs"/>
     <include name="TestBuilderAttribute.cs"/>
     <include name="TestCaseBuilder.cs"/>
@@ -63,6 +65,7 @@
     <include name="TestThread.cs"/>
     <include name="TextCapture.cs"/>
     <include name="ThreadedTestRunner.cs"/>
+    <include name="ThreadUtility.cs"/>
     <include name="TypeHelper.cs"/>
     <include name="Builders/CombinatorialStrategy.cs"/>
     <include name="Builders/CombinatorialTestCaseProvider.cs"/>
diff --git a/src/NUnitCore/core/nunit.core.dll.csproj b/src/NUnitCore/core/nunit.core.dll.csproj
index 303ba82..2c1e6c4 100644
--- a/src/NUnitCore/core/nunit.core.dll.csproj
+++ b/src/NUnitCore/core/nunit.core.dll.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -44,7 +44,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -62,7 +62,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -117,6 +117,7 @@
     <Compile Include="AssemblyInfo.cs" />
     <Compile Include="AssemblyReader.cs" />
     <Compile Include="AssemblyResolver.cs" />
+    <Compile Include="ActionsHelper.cs" />
     <Compile Include="Builders\CombinatorialStrategy.cs" />
     <Compile Include="Builders\CombinatorialTestCaseProvider.cs" />
     <Compile Include="Builders\CombiningStrategy.cs" />
@@ -134,6 +135,7 @@
     <Compile Include="Builders\TestCaseParameterProvider.cs" />
     <Compile Include="Builders\TestCaseSourceProvider.cs" />
     <Compile Include="Builders\ValueSourceProvider.cs" />
+    <Compile Include="ContextDictionary.cs" />
     <Compile Include="CoreExtensions.cs" />
     <Compile Include="CultureDetector.cs" />
     <Compile Include="DirectorySwapper.cs" />
@@ -158,7 +160,6 @@
     <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" />
@@ -182,6 +183,7 @@
     <Compile Include="SimpleTestRunner.cs" />
     <Compile Include="StringTextWriter.cs" />
     <Compile Include="SuiteBuilderAttribute.cs" />
+    <Compile Include="TestAction.cs" />
     <Compile Include="TestAssembly.cs" />
     <Compile Include="TestBuilderAttribute.cs" />
     <Compile Include="TestCaseBuilderAttribute.cs" />
@@ -196,6 +198,7 @@
     <Compile Include="TestThread.cs" />
     <Compile Include="TextCapture.cs" />
     <Compile Include="ThreadedTestRunner.cs" />
+    <Compile Include="ThreadUtility.cs" />
     <Compile Include="TypeHelper.cs" />
   </ItemGroup>
   <ItemGroup>
diff --git a/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs b/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
index 4946338..84915ee 100644
--- a/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
@@ -19,12 +19,15 @@ namespace NUnit.Core.Extensibility
     public class ParameterSet : NUnit.Framework.ITestCaseData
     {
         #region Constants
+
         private static readonly string DESCRIPTION = "_DESCRIPTION";
-        private static readonly string IGNOREREASON = "_IGNOREREASON";
+        //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;
@@ -33,10 +36,11 @@ namespace NUnit.Core.Extensibility
         private string expectedExceptionName;
         private string expectedMessage;
         private string matchType;
-        private object result;
+        private object expectedResult;
         private string testName;
         private string ignoreReason;
         private bool isIgnored;
+        private bool isExplicit;
         private bool hasExpectedResult;
 
         /// <summary>
@@ -44,6 +48,7 @@ namespace NUnit.Core.Extensibility
         /// to tests without requiring the class to change.
         /// </summary>
         private IDictionary properties;
+
         #endregion
 
         #region Properties
@@ -56,14 +61,14 @@ namespace NUnit.Core.Extensibility
             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>
+        ///// 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
@@ -140,10 +145,10 @@ namespace NUnit.Core.Extensibility
         /// </summary>
         public object Result
         {
-            get { return result; }
+            get { return expectedResult; }
             set 
             { 
-                result = value;
+                expectedResult = value;
                 hasExpectedResult = true;
             }
         }
@@ -194,6 +199,16 @@ namespace NUnit.Core.Extensibility
         }
 
         /// <summary>
+        /// Gets or sets a value indicating whether this <see cref="ParameterSet"/> is explicit.
+        /// </summary>
+        /// <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        public bool Explicit
+        {
+            get { return isExplicit; }
+            set { isExplicit = value; }
+        }
+
+        /// <summary>
         /// Gets or sets the ignore reason.
         /// </summary>
         /// <value>The ignore reason.</value>
@@ -241,6 +256,7 @@ namespace NUnit.Core.Extensibility
         {
             this.runState = RunState.NotRunnable;
             this.providerException = exception;
+            this.ignoreReason = exception.Message;
         }
 
         /// <summary>
@@ -254,6 +270,7 @@ namespace NUnit.Core.Extensibility
         #endregion
 
         #region Static Methods
+
         /// <summary>
         /// Constructs a ParameterSet from another object, accessing properties 
         /// by reflection. The object must expose at least an Arguments property
@@ -265,24 +282,38 @@ namespace NUnit.Core.Extensibility
             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);
+
+            // Note: pre-2.6 versions of some attributes don't have the HasExpectedResult property
+            object hasResult = GetParm(source, PropertyNames.HasExpectedResult);
+            object expectedResult = GetParm(source, PropertyNames.ExpectedResult);
+            if (hasResult != null && (bool)hasResult || expectedResult != null)
+                parms.Result = expectedResult;
+
             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 )
+            if (objIgnore != null)
                 parms.Ignored = (bool)objIgnore;
+
             parms.IgnoreReason = GetParm(source, PropertyNames.IgnoreReason) as string;
 
+            object objExplicit = GetParm(source, PropertyNames.Explicit);
+            if (objExplicit != null)
+                parms.Explicit = (bool)objExplicit;
+
             // Some sources may also implement Properties and/or Categories
             bool gotCategories = false;
             IDictionary props = GetParm(source, PropertyNames.Properties) as IDictionary;
@@ -298,7 +329,7 @@ namespace NUnit.Core.Extensibility
             if (!gotCategories)
             {
                 IList categories = GetParm(source, PropertyNames.Categories) as IList;
-                if (categories != null) 
+                if (categories != null)
                     foreach (string cat in categories)
                         parms.Categories.Add(cat);
             }
diff --git a/src/NUnitCore/interfaces/Filters/AndFilter.cs b/src/NUnitCore/interfaces/Filters/AndFilter.cs
index 787af24..48d9212 100644
--- a/src/NUnitCore/interfaces/Filters/AndFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/AndFilter.cs
@@ -78,5 +78,24 @@ namespace NUnit.Core.Filters
 
 			return true;
 		}
+
+        /// <summary>
+        /// Return string representation of  the filter.
+        /// </summary>
+        public override string ToString()
+        {
+            int count = 0;
+            System.Text.StringBuilder sb = new System.Text.StringBuilder();
+
+            foreach (TestFilter filter in filters)
+            {
+                if (count++ > 0)
+                    sb.Append(" and ");
+
+                sb.Append(filter.ToString());
+            }
+
+            return sb.ToString();
+        }
 	}
 }
diff --git a/src/NUnitCore/interfaces/Filters/NotFilter.cs b/src/NUnitCore/interfaces/Filters/NotFilter.cs
index bc18e9e..6bd1972 100644
--- a/src/NUnitCore/interfaces/Filters/NotFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/NotFilter.cs
@@ -73,6 +73,14 @@ namespace NUnit.Core.Filters
 			}
 
 			return false;
-		}	
+		}
+
+        /// <summary>
+        /// Return string representation of the filter
+        /// </summary>
+        public override string ToString()
+        {
+            return "not " + baseFilter.ToString();
+        }
 	}
 }
diff --git a/src/NUnitCore/interfaces/Filters/OrFilter.cs b/src/NUnitCore/interfaces/Filters/OrFilter.cs
index c0fba0e..e840992 100644
--- a/src/NUnitCore/interfaces/Filters/OrFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/OrFilter.cs
@@ -5,6 +5,7 @@
 // ****************************************************************
 using System;
 using System.Collections;
+using System.Text;
 
 namespace NUnit.Core.Filters
 {
@@ -78,5 +79,20 @@ namespace NUnit.Core.Filters
 
 			return false;
 		}
-	}
+
+        /// <summary>
+        /// Return the string representation of an or filter
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < filters.Count; i++)
+            {
+                if (i > 0) sb.Append(" or ");
+                sb.Append(filters[i]);
+            }
+            return sb.ToString();
+        }
+    }
 }
diff --git a/src/NUnitCore/interfaces/LoggingThreshold.cs b/src/NUnitCore/interfaces/LoggingThreshold.cs
new file mode 100644
index 0000000..425ae01
--- /dev/null
+++ b/src/NUnitCore/interfaces/LoggingThreshold.cs
@@ -0,0 +1,32 @@
+// ****************************************************************
+// Copyright 2012, 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.Core
+{
+    /// <summary>
+    /// Enumeration expressing the level of log messages to be 
+    /// captured by NUnit and sent to the runner. These happen
+    /// to match the standard levels used by log4net, but will
+    /// be translated for any other loggers we support.
+    /// </summary>
+    public enum LoggingThreshold
+    {
+        /// <summary>No logging</summary>
+        Off = 0,
+        /// <summary>Severe error beyond which continuation is not possible</summary>
+        Fatal = 1,
+        /// <summary>Error that may allow continuation</summary>
+        Error = 2,
+        /// <summary>A warning message</summary>
+        Warn = 3,
+        /// <summary>An informational message</summary>
+        Info = 4,
+        /// <summary>Messages used for debugging</summary>
+        Debug = 5,
+        /// <summary>All of the preceding plus more detailled messages if supported</summary>
+        All = 6,
+    }
+}
diff --git a/src/NUnitCore/interfaces/OSPlatform.cs b/src/NUnitCore/interfaces/OSPlatform.cs
index dc1aa87..f893bc5 100644
--- a/src/NUnitCore/interfaces/OSPlatform.cs
+++ b/src/NUnitCore/interfaces/OSPlatform.cs
@@ -319,11 +319,27 @@ namespace NUnit.Core
         }
 
         /// <summary>
+        /// Return true if the platform is Windows 2012 Server
+        /// </summary>
+        public bool IsWin2012Server
+        {
+            get { return IsNT6 && version.Minor == 2 && 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; }
         }
+
+        /// <summary>
+        /// Return true if the platform is Windows 8
+        /// </summary>
+        public bool IsWindows8
+        {
+            get { return IsNT6 && version.Minor == 2 && Product == ProductType.WorkStation; }
+        }
     }
 }
diff --git a/src/NUnitCore/interfaces/PropertyNames.cs b/src/NUnitCore/interfaces/PropertyNames.cs
index 4c6bf1a..17ab9d3 100644
--- a/src/NUnitCore/interfaces/PropertyNames.cs
+++ b/src/NUnitCore/interfaces/PropertyNames.cs
@@ -28,7 +28,9 @@ namespace NUnit.Core
         /// <summary>ExpectedException MatchType</summary>
         public static readonly string MatchType = "MatchType";
         /// <summary>Expected return result from test</summary>
-        public static readonly string Result = "Result";
+        public static readonly string ExpectedResult = "Result";
+        /// <summary>Indicates whether there is an expected return result</summary>
+        public static readonly string HasExpectedResult = "HasExpectedResult";
         /// <summary>Description of the test</summary>
         public static readonly string Description = "Description";
         /// <summary>Alternate test name</summary>
@@ -37,6 +39,8 @@ namespace NUnit.Core
         public static readonly string Arguments = "Arguments";
         /// <summary>Indicates test case is ignored</summary>
         public static readonly string Ignored = "Ignored";
+        /// <summary>Indicates test case is explicit</summary>
+        public static readonly string Explicit = "Explicit";
         /// <summary>The reason a test case is ignored</summary>
         public static readonly string IgnoreReason = "IgnoreReason";
         /// <summary>Properties of the test</summary>
diff --git a/src/NUnitCore/interfaces/RuntimeFramework.cs b/src/NUnitCore/interfaces/RuntimeFramework.cs
index 11edd38..45c3aa6 100644
--- a/src/NUnitCore/interfaces/RuntimeFramework.cs
+++ b/src/NUnitCore/interfaces/RuntimeFramework.cs
@@ -47,6 +47,12 @@ namespace NUnit.Core
 
         private static RuntimeFramework currentFramework;
         private static RuntimeFramework[] availableFrameworks;
+        private static Version[] knownVersions = new Version[] {
+            new Version(1, 0, 3705),
+            new Version(1, 1, 4322),
+            new Version(2, 0, 50727),
+            new Version(4, 0, 30319)
+        };
       
         private RuntimeType runtime;
         private Version frameworkVersion;
@@ -63,18 +69,52 @@ namespace NUnit.Core
 		/// <param name="version">The version of the framework</param>
 		public RuntimeFramework( RuntimeType runtime, Version version)
 		{
-			this.runtime = runtime;
-            this.frameworkVersion = version;
+            this.runtime = runtime;
 
-            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);
+            if (version.Build < 0)
+                InitFromFrameworkVersion(version);
+            else
+                InitFromClrVersion(version);
+
+
+            if (version.Major == 3)
+                this.clrVersion = new Version(2, 0, 50727);
+            //else if (runtime == RuntimeType.Mono && version.Major == 1)
+            //{
+            //    if (version.Minor == 0)
+            //        this.clrVersion = new Version(1, 1);
+            //    else if (version.Minor == 1)
+            //        this.frameworkVersion = new Version(1, 0);
+            //}
 
             this.displayName = GetDefaultDisplayName(runtime, version);
         }
 
+        private void InitFromFrameworkVersion(Version version)
+        {
+            this.frameworkVersion = this.clrVersion = version;
+            foreach (Version v in knownVersions)
+                if (v.Major == version.Major && v.Minor == version.Minor)
+                {
+                    this.clrVersion = v;
+                    break;
+                }
+
+            if (this.runtime == RuntimeType.Mono && version.Major == 1)
+            {
+                this.frameworkVersion = new Version(1, 0);
+                this.clrVersion = new Version(1, 1, 4322);
+            }
+        }
+
+        private void InitFromClrVersion(Version version)
+        {
+            this.frameworkVersion = new Version(version.Major, version.Minor);
+            this.clrVersion = version;
+            if (runtime == RuntimeType.Mono && version.Major == 1)
+                this.frameworkVersion = new Version(1, 0);
+        }
+
         #endregion
 
         #region Properties
@@ -97,8 +137,41 @@ namespace NUnit.Core
                     int major = Environment.Version.Major;
                     int minor = Environment.Version.Minor;
 
-                    if (isMono && major == 1)
-                        minor = 0;
+                    if (isMono)
+					{
+						switch (major)
+						{
+						case 1:
+                        	minor = 0;
+							break;
+						case 2:
+							major = 3;
+							minor = 5;
+							break;
+						}
+					}
+					else /* It's windows */
+					if (major == 2)
+                    {
+                        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework");
+                        if (key != null)
+                        {
+                            string installRoot = key.GetValue("InstallRoot") as string;
+                            if (installRoot != null)
+                            {
+                                if (Directory.Exists(Path.Combine(installRoot, "v3.5")))
+                                {
+                                    major = 3;
+                                    minor = 5;
+                                }
+                                else if (Directory.Exists(Path.Combine(installRoot, "v3.0")))
+                                {
+                                    major = 3;
+                                    minor = 0;
+                                }
+                            }
+                        }
+                    }
 
                     currentFramework = new RuntimeFramework(runtime, new Version(major, minor));
                     currentFramework.clrVersion = Environment.Version;
@@ -108,7 +181,8 @@ namespace NUnit.Core
                         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]);
+                            currentFramework.displayName += string.Format(" ( {0} )",
+                                (string)getDisplayNameMethod.Invoke(null, new object[0]));
                     }
                 }
 
@@ -150,7 +224,7 @@ namespace NUnit.Core
             get
             {
                 foreach (RuntimeFramework framework in AvailableFrameworks)
-                    if (this.Matches(framework))
+                    if (this.Supports(framework))
                         return true;
 
                 return false;
@@ -254,7 +328,7 @@ namespace NUnit.Core
             if (target.ClrVersion.Build < 0)
             {
                 foreach (RuntimeFramework framework in AvailableFrameworks)
-                    if (framework.Matches(target) && 
+                    if (framework.Supports(target) && 
                         framework.ClrVersion.Build > result.ClrVersion.Build)
                     {
                         result = framework;
@@ -285,32 +359,34 @@ namespace NUnit.Core
 		}
 
         /// <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.
+        /// Returns true if this framework's supports executing under the 
+        /// requested target framework. The target is supported if
+        /// 
+        /// 1. The runtime types are the same or either one is RuntimeType.Any
+        /// 
+        /// 2. All specified (non-negative) components of the CLR version are equal. 
+        /// 
+        /// 3. The major and minor components of the current framework version are
+        ///    greater than or equal to the corresponding target components.
+        ///    
+        /// The last provision allows tests requiring .NET 2.0 to run under the
+        /// 3.0 and 3.5 platforms as well.
         /// </summary>
-        /// <param name="other">The RuntimeFramework to be matched.</param>
+        /// <param name="target">The RuntimeFramework to be matched.</param>
         /// <returns>True on match, otherwise false</returns>
-        public bool Matches(RuntimeFramework other)
+        public bool Supports(RuntimeFramework target)
         {
             if (this.Runtime != RuntimeType.Any
-                && other.Runtime != RuntimeType.Any
-                && this.Runtime != other.Runtime)
+                && target.Runtime != RuntimeType.Any
+                && this.Runtime != target.Runtime)
                 return false;
 
-            if (this.AllowAnyVersion || other.AllowAnyVersion)
+            if (this.AllowAnyVersion || target.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 );
+            return VersionsMatch(this.ClrVersion, target.ClrVersion)
+                && this.FrameworkVersion.Major >= target.FrameworkVersion.Major
+                && this.FrameworkVersion.Minor >= target.FrameworkVersion.Minor;
         }
 
         #endregion
@@ -336,6 +412,14 @@ namespace NUnit.Core
                 return runtime.ToString() + " " + version.ToString();
         }
 
+        private static bool VersionsMatch(Version v1, Version v2)
+        {
+            return v1.Major == v2.Major &&
+                   v1.Minor == v2.Minor &&
+                  (v1.Build < 0 || v2.Build < 0 || v1.Build == v2.Build) &&
+                  (v1.Revision < 0 || v2.Revision < 0 || v1.Revision == v2.Revision);
+        }
+
         private static void AppendMonoFrameworks(FrameworkCollection frameworks)
         {
             if (Environment.OSVersion.Platform == PlatformID.Win32NT)
@@ -446,7 +530,7 @@ namespace NUnit.Core
             }
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         private class FrameworkCollection : System.Collections.Generic.List<RuntimeFramework> { }
 #else
         private class FrameworkCollection : ArrayList 
diff --git a/src/NUnitCore/interfaces/Test.cs b/src/NUnitCore/interfaces/Test.cs
index d1fee36..bb28d46 100644
--- a/src/NUnitCore/interfaces/Test.cs
+++ b/src/NUnitCore/interfaces/Test.cs
@@ -75,7 +75,7 @@ namespace NUnit.Core
         /// </summary>
         protected ApartmentState GetCurrentApartment()
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             return Thread.CurrentThread.GetApartmentState();
 #else
             return Thread.CurrentThread.ApartmentState;
diff --git a/src/NUnitCore/interfaces/TestResult.cs b/src/NUnitCore/interfaces/TestResult.cs
index 55965b2..279c916 100644
--- a/src/NUnitCore/interfaces/TestResult.cs
+++ b/src/NUnitCore/interfaces/TestResult.cs
@@ -435,13 +435,19 @@ namespace NUnit.Core
             {
                 case ResultState.Failure:
                 case ResultState.Error:
-                    if (!this.IsFailure && !this.IsError)
-                        this.Failure("Child test failed", null, FailureSite.Child);
+                case ResultState.NotRunnable:
+                    if (!this.IsFailure && !this.IsError && this.ResultState != ResultState.NotRunnable)
+                        this.Failure("One or more child tests had errors", null, FailureSite.Child);
                     break;
                 case ResultState.Success:
                     if (this.ResultState == ResultState.Inconclusive)
                         this.Success();
                     break;
+                // Removed this case due to bug #928018
+                //case ResultState.Ignored:
+                //    if (this.ResultState == ResultState.Inconclusive || ResultState == ResultState.Success)
+                //        this.SetResult(ResultState.Ignored, "One or more child tests were ignored", null, FailureSite.Child);
+                //    break;
                 case ResultState.Cancelled:
                     this.SetResult(ResultState.Cancelled, result.Message, null, FailureSite.Child);
                     break;
diff --git a/src/NUnitCore/interfaces/TestRunner.cs b/src/NUnitCore/interfaces/TestRunner.cs
index 447bdd1..4a6a479 100644
--- a/src/NUnitCore/interfaces/TestRunner.cs
+++ b/src/NUnitCore/interfaces/TestRunner.cs
@@ -110,37 +110,30 @@ namespace NUnit.Core
 		#endregion
 
 		#region Run Methods
-		/// <summary>
-		/// Run all loaded tests and return a test result. The test is run synchronously,
-		/// and the listener interface is notified as it progresses.
-		/// </summary>
-		/// <param name="listener">Interface to receive EventListener notifications.</param>
-		TestResult Run(NUnit.Core.EventListener listener);
 
-		/// <summary>
-		/// Run selected tests and return a test result. The test is run synchronously,
-		/// and the listener interface is notified as it progresses.
-		/// </summary>
-		/// <param name="listener">Interface to receive EventListener notifications.</param>
-		/// <param name="filter">The filter to apply when running the tests</param>
-		TestResult Run(NUnit.Core.EventListener listener, ITestFilter filter);
-		
-		/// <summary>
-		/// Start a run of all loaded tests. The tests are run aynchronously and the 
-		/// listener interface is notified as it progresses.
-		/// </summary>
-		/// <param name="listener">Interface to receive EventListener notifications.</param>
-		void BeginRun(NUnit.Core.EventListener listener);
+        /// <summary>
+        /// Run selected tests and return a test result. The test is run synchronously,
+        /// and the listener interface is notified as it progresses. Arguments control whether
+        /// trace and log output are passed back to the caller.
+        /// </summary>
+        /// <param name="listener">Interface to receive EventListener notifications.</param>
+        /// <param name="filter">The filter to apply when running the tests</param>
+        /// <param name="captureTrace">If true, trace output is returned as a TestOutput event</param>
+        /// <param name="logLevel">The threshold for log output to be returned as a TestOutput event</param>
+        TestResult Run(NUnit.Core.EventListener listener, ITestFilter filter, bool captureTrace, LoggingThreshold logLevel);
 
-		/// <summary>
-		/// Start a run of selected tests. The tests are run aynchronously and the 
-		/// listener interface is notified as it progresses.
-		/// </summary>
-		/// <param name="listener">Interface to receive EventListener notifications.</param>
-		/// <param name="filter">The filter to apply when running the tests</param>
-		void BeginRun(NUnit.Core.EventListener listener, ITestFilter filter);
-		
-		/// <summary>
+        /// <summary>
+        /// Start a run of selected tests. The tests are run aynchronously and the 
+        /// listener interface is notified as it progresses. Arguments control whether
+        /// trace and log output are passed back to the caller.
+        /// </summary>
+        /// <param name="listener">Interface to receive EventListener notifications.</param>
+        /// <param name="filter">The filter to apply when running the tests</param>
+        /// <param name="captureTrace">If true, trace output is returned as a TestOutput event</param>
+        /// <param name="logLevel">The threshold for log output to be returned as a TestOutput event</param>
+        void BeginRun(NUnit.Core.EventListener listener, ITestFilter filter, bool captureTrace, LoggingThreshold logLevel);
+
+        /// <summary>
 		/// Wait for an asynchronous run to complete and return the result.
 		/// </summary>
 		/// <returns>A TestResult for the entire run</returns>
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.build b/src/NUnitCore/interfaces/nunit.core.interfaces.build
index 0088c4e..92dd02e 100644
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.build
+++ b/src/NUnitCore/interfaces/nunit.core.interfaces.build
@@ -8,6 +8,7 @@
         <include name="IService.cs"/>
         <include name="ITest.cs"/>
         <include name="ITestFilter.cs"/>
+    <include name="LoggingThreshold.cs"/>
         <include name="OSPlatform.cs"/>
         <include name="PropertyNames.cs"/>
         <include name="ResultState.cs"/>
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj b/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
index 0e6faee..6be88d0 100644
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
+++ b/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{435428F8-5995-4CE4-8022-93D595A8CC0F}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -29,8 +29,8 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
-    <DocumentationFile>..\..\bin\Debug\lib\nunit.core.interfaces.xml</DocumentationFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>..\..\..\bin\Debug\lib\nunit.core.interfaces.xml</DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
     <FileAlignment>4096</FileAlignment>
     <NoWarn>1699</NoWarn>
@@ -46,8 +46,8 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
-    <DocumentationFile>..\..\bin\Release\lib\nunit.core.interfaces.xml</DocumentationFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>..\..\..\bin\Release\lib\nunit.core.interfaces.xml</DocumentationFile>
     <FileAlignment>4096</FileAlignment>
     <NoWarn>1699</NoWarn>
     <Optimize>true</Optimize>
@@ -120,6 +120,7 @@
     <Compile Include="TestPackage.cs" />
     <Compile Include="TestResult.cs" />
     <Compile Include="TestRunner.cs" />
+    <Compile Include="LoggingThreshold.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="nunit.core.interfaces.build" />
diff --git a/src/NUnitCore/tests/ActionAttributeExceptionTests.cs b/src/NUnitCore/tests/ActionAttributeExceptionTests.cs
new file mode 100644
index 0000000..bca8e09
--- /dev/null
+++ b/src/NUnitCore/tests/ActionAttributeExceptionTests.cs
@@ -0,0 +1,79 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using NUnit.Framework;
+using NUnit.TestData;
+using NUnit.TestData.ActionAttributeTests;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class ActionAttributeExceptionTests
+    {
+        private class Filter : TestFilter
+        {
+            public override bool Match(ITest test)
+            {
+                return test.TestName.FullName.StartsWith(typeof(ActionAttributeExceptionFixture).FullName);
+            }
+        }
+
+        private TestSuite _Suite = null;
+
+        [TestFixtureSetUp]
+        public void Setup()
+        {
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+            TestPackage package = new TestPackage(AssemblyHelper.GetAssemblyPath(typeof(ActionAttributeExceptionFixture)));
+            package.TestName = typeof(ActionAttributeExceptionFixture).Namespace;
+
+            _Suite = builder.Build(package);
+        }
+
+        public TestResult RunTest()
+        {
+            return _Suite.Run(new NullListener(), new Filter());
+        }
+
+        private TestResult FindFailureTestResult(TestResult result)
+        {
+            while (result.FailureSite == FailureSite.Child && result.Results != null && result.Results.Count > 0)
+                result = (TestResult)result.Results[0];
+
+            return result;
+        }
+
+        [Test]
+        public void BeforeTestException()
+        {
+            ExceptionThrowingActionAttribute.Reset();
+            ExceptionThrowingActionAttribute.ThrowBeforeException = true;
+
+            ActionAttributeExceptionFixture.Reset();
+
+            TestResult result = FindFailureTestResult(RunTest());
+
+            Assert.IsTrue(result.FailureSite == FailureSite.SetUp);
+            Assert.IsFalse(ActionAttributeExceptionFixture.TestRun);
+        }
+
+        [Test]
+        public void AfterTestException()
+        {
+            ExceptionThrowingActionAttribute.Reset();
+            ExceptionThrowingActionAttribute.ThrowAfterException = true;
+
+            ActionAttributeExceptionFixture.Reset();
+
+            TestResult result = FindFailureTestResult(RunTest());
+
+            Assert.IsTrue(result.FailureSite == FailureSite.TearDown);
+            Assert.IsTrue(ActionAttributeExceptionFixture.TestRun);
+        }
+    }
+}
+#endif
diff --git a/src/NUnitCore/tests/ActionAttributeTests.cs b/src/NUnitCore/tests/ActionAttributeTests.cs
new file mode 100644
index 0000000..ba10b4d
--- /dev/null
+++ b/src/NUnitCore/tests/ActionAttributeTests.cs
@@ -0,0 +1,190 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+//#define DEFAULT_APPLIES_TO_TESTCASE
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using NUnit.Framework;
+using NUnit.TestData.ActionAttributeTests;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class ActionAttributeTests
+    {
+        private class ActionAttributeFixtureFilter : TestFilter
+        {
+            public override bool Match(ITest test)
+            {
+                return test.TestName.FullName.StartsWith(typeof(ActionAttributeFixture).FullName);
+            }
+        }
+
+        private TestResult _result = null;
+        private readonly string[] _suiteSites = new string[]
+        {
+            "Assembly",
+            "BaseSetupFixture",
+            "SetupFixture",
+            "BaseInterface",
+            "BaseFixture",
+            "Interface",
+            "Fixture"
+        };
+
+        private readonly string[] _parameterizedTestOutput = new string[]
+        {
+            "SomeTest-Case1",
+            "SomeTest-Case2"
+        };
+
+        private readonly string[] _testOutput = new string[]
+        {
+            "SomeTestNotParameterized",
+        };
+
+        [TestFixtureSetUp]
+        public void Setup()
+        {
+            ActionAttributeFixture.Results = new List<string>();
+
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+            TestPackage package = new TestPackage(AssemblyHelper.GetAssemblyPath(typeof(ActionAttributeFixture)));
+            package.TestName = typeof(ActionAttributeFixture).Namespace;
+
+            Test suite = builder.Build(package);
+            _result = suite.Run(new NullListener(), new ActionAttributeFixtureFilter());
+        }
+
+        [Test]
+        public void TestsRunsSuccessfully()
+        {
+            Assert.IsTrue(_result.IsSuccess, "Test run was not successful.");
+
+            Console.WriteLine("{prefix}.{phase}.{hasFixture}.{hasMethod}");            
+            foreach(string message in ActionAttributeFixture.Results)
+                Console.WriteLine(message);
+        }
+
+        private void AssertResultEquals(List<string> input, int index, string expected)
+        {
+            Assert.IsTrue(input[index].Equals(expected), string.Format("Did not find '{0}' at index {1}; instead '{2}'", expected, index, input[index]));
+        }
+
+        [Test]
+        public void ExpectedOutput_InCorrectOrder()
+        {
+            string[] expectedResults = new string[] {
+                "AssemblySuite.Before.false.false",
+                "AssemblySite.Before.false.false",
+                "BaseSetupFixtureSuite.Before.true.false",
+                "BaseSetupFixtureSite.Before.true.false",
+                "SetupFixtureSuite.Before.true.false",
+                "SetupFixtureSite.Before.true.false",
+                "BaseInterfaceSuite.Before.true.false",
+                "BaseInterfaceSite.Before.true.false",
+                "BaseFixtureSuite.Before.true.false",
+                "BaseFixtureSite.Before.true.false",
+                "InterfaceSuite.Before.true.false",
+                "InterfaceSite.Before.true.false",
+                "FixtureSuite.Before.true.false",
+                "FixtureSite.Before.true.false",
+                "ParameterizedSuite.Before.true.false",
+#if DEFAULT_APPLIES_TO_TESTCASE
+                "ParameterizedSite.Before.true.false",
+#endif
+                "AssemblyTest.Before.true.true",
+                "BaseSetupFixtureTest.Before.true.true",
+                "SetupFixtureTest.Before.true.true",
+                "BaseInterfaceTest.Before.true.true",
+                "BaseFixtureTest.Before.true.true",
+                "InterfaceTest.Before.true.true",
+                "FixtureTest.Before.true.true",
+                "ParameterizedTest.Before.true.true",
+#if !DEFAULT_APPLIES_TO_TESTCASE
+                "ParameterizedSite.Before.true.true",
+#endif
+                "SomeTest",
+#if !DEFAULT_APPLIES_TO_TESTCASE
+                "ParameterizedSite.After.true.true",
+#endif
+                "ParameterizedTest.After.true.true",
+                "FixtureTest.After.true.true",
+                "InterfaceTest.After.true.true",
+                "BaseFixtureTest.After.true.true",
+                "BaseInterfaceTest.After.true.true",
+                "SetupFixtureTest.After.true.true",
+                "BaseSetupFixtureTest.After.true.true",
+                "AssemblyTest.After.true.true",
+                "AssemblyTest.Before.true.true",
+                "BaseSetupFixtureTest.Before.true.true",
+                "SetupFixtureTest.Before.true.true",
+                "BaseInterfaceTest.Before.true.true",
+                "BaseFixtureTest.Before.true.true",
+                "InterfaceTest.Before.true.true",
+                "FixtureTest.Before.true.true",
+                "ParameterizedTest.Before.true.true",
+#if !DEFAULT_APPLIES_TO_TESTCASE
+                "ParameterizedSite.Before.true.true",
+#endif
+                "SomeTest",
+#if !DEFAULT_APPLIES_TO_TESTCASE
+                "ParameterizedSite.After.true.true",
+#endif
+                "ParameterizedTest.After.true.true",
+                "FixtureTest.After.true.true",
+                "InterfaceTest.After.true.true",
+                "BaseFixtureTest.After.true.true",
+                "BaseInterfaceTest.After.true.true",
+                "SetupFixtureTest.After.true.true",
+                "BaseSetupFixtureTest.After.true.true",
+                "AssemblyTest.After.true.true",
+#if DEFAULT_APPLIES_TO_TESTCASE
+                "ParameterizedSite.After.true.false",
+#endif
+                "ParameterizedSuite.After.true.false",
+                "AssemblyTest.Before.true.true",
+                "BaseSetupFixtureTest.Before.true.true",
+                "SetupFixtureTest.Before.true.true",
+                "BaseInterfaceTest.Before.true.true",
+                "BaseFixtureTest.Before.true.true",
+                "InterfaceTest.Before.true.true",
+                "FixtureTest.Before.true.true",
+                "MethodTest.Before.true.true",
+                "MethodSite.Before.true.true",
+                "SomeTestNotParameterized",
+                "MethodSite.After.true.true",
+                "MethodTest.After.true.true",
+                "FixtureTest.After.true.true",
+                "InterfaceTest.After.true.true",
+                "BaseFixtureTest.After.true.true",
+                "BaseInterfaceTest.After.true.true",
+                "SetupFixtureTest.After.true.true",
+                "BaseSetupFixtureTest.After.true.true",
+                "AssemblyTest.After.true.true",
+                "FixtureSite.After.true.false",
+                "FixtureSuite.After.true.false",
+                "InterfaceSite.After.true.false",
+                "InterfaceSuite.After.true.false",
+                "BaseFixtureSite.After.true.false",
+                "BaseFixtureSuite.After.true.false",
+                "BaseInterfaceSite.After.true.false",
+                "BaseInterfaceSuite.After.true.false",
+                "SetupFixtureSite.After.true.false",
+                "SetupFixtureSuite.After.true.false",
+                "BaseSetupFixtureSite.After.true.false",
+                "BaseSetupFixtureSuite.After.true.false",
+                "AssemblySite.After.false.false",
+                "AssemblySuite.After.false.false"
+            };
+
+            Assert.AreEqual(expectedResults, ActionAttributeFixture.Results);
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/AssemblyHelperTests.cs b/src/NUnitCore/tests/AssemblyHelperTests.cs
index 110e47c..04bccf6 100644
--- a/src/NUnitCore/tests/AssemblyHelperTests.cs
+++ b/src/NUnitCore/tests/AssemblyHelperTests.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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;
 
@@ -22,5 +28,36 @@ namespace NUnit.Core.Tests
             Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
             Assert.That(File.Exists(path));
         }
-    }
+		
+		[Platform("Win")]
+        [TestCase(@"file:///C:/path/to/assembly.dll", Result=@"C:/path/to/assembly.dll")]
+        [TestCase(@"file://C:/path/to/assembly.dll", Result=@"C:/path/to/assembly.dll")]
+        [TestCase(@"file://C:/my path/to my/assembly.dll", Result = @"C:/my path/to my/assembly.dll")]
+        [TestCase(@"file:///C:/dev/C#/assembly.dll", Result = @"C:/dev/C#/assembly.dll")]
+        [TestCase(@"file:///C:/dev/funnychars?:=/assembly.dll", Result = @"C:/dev/funnychars?:=/assembly.dll")]
+        [TestCase(@"file:///path/to/assembly.dll", Result = @"/path/to/assembly.dll")]
+        [TestCase(@"file://path/to/assembly.dll", Result = @"path/to/assembly.dll")]
+        [TestCase(@"file:///my path/to my/assembly.dll", Result = @"/my path/to my/assembly.dll")]
+        [TestCase(@"file://my path/to my/assembly.dll", Result = @"my path/to my/assembly.dll")]
+        [TestCase(@"file:///dev/C#/assembly.dll", Result = @"/dev/C#/assembly.dll")]
+        [TestCase(@"file:///dev/funnychars?:=/assembly.dll", Result = @"/dev/funnychars?:=/assembly.dll")]
+        //[TestCase(@"http://server/path/to/assembly.dll", Result="//server/path/to/assembly.dll")]
+        public string GetAssemblyPathFromFileUri_Windows(string uri)
+        {
+            return AssemblyHelper.GetAssemblyPathFromFileUri(uri);
+        }
+		
+		[Platform("Linux")]
+        [TestCase(@"file:///path/to/assembly.dll", Result = @"/path/to/assembly.dll")]
+        [TestCase(@"file://path/to/assembly.dll", Result = @"/path/to/assembly.dll")]
+        [TestCase(@"file:///my path/to my/assembly.dll", Result = @"/my path/to my/assembly.dll")]
+        [TestCase(@"file://my path/to my/assembly.dll", Result = @"/my path/to my/assembly.dll")]
+        [TestCase(@"file:///dev/C#/assembly.dll", Result = @"/dev/C#/assembly.dll")]
+        [TestCase(@"file:///dev/funnychars?:=/assembly.dll", Result = @"/dev/funnychars?:=/assembly.dll")]
+        //[TestCase(@"http://server/path/to/assembly.dll", Result="//server/path/to/assembly.dll")]
+        public string GetAssemblyPathFromFileUri_Linux(string uri)
+        {
+            return AssemblyHelper.GetAssemblyPathFromFileUri(uri);
+        }
+}
 }
diff --git a/src/NUnitCore/tests/AssemblyTests.cs b/src/NUnitCore/tests/AssemblyTests.cs
index eb8dd62..a0c51fa 100644
--- a/src/NUnitCore/tests/AssemblyTests.cs
+++ b/src/NUnitCore/tests/AssemblyTests.cs
@@ -36,11 +36,11 @@ namespace NUnit.Core.Tests
 			Assert.IsTrue( File.Exists( thisDll ), "Run does not set current directory" );
 		}
 
-		[Test]
-		public void NUnitTraceIsEnabled()
-		{
-			Assert.IsNotNull( Trace.Listeners["NUnit"] );
-		}
+        //[Test]
+        //public void NUnitTraceIsEnabled()
+        //{
+        //    Assert.IsNotNull( Trace.Listeners["NUnit"] );
+        //}
 
 		[Test]
 		public void LoadAssembly()
diff --git a/src/NUnitCore/tests/BasicRunnerTests.cs b/src/NUnitCore/tests/BasicRunnerTests.cs
index 019160e..ce0b643 100644
--- a/src/NUnitCore/tests/BasicRunnerTests.cs
+++ b/src/NUnitCore/tests/BasicRunnerTests.cs
@@ -147,7 +147,7 @@ namespace NUnit.Core.Tests
 		public void RunAssembly()
 		{
 			runner.Load(package1);
-			TestResult result = runner.Run( NullListener.NULL );
+			TestResult result = runner.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
 			ResultSummarizer summary = new ResultSummarizer(result);
 			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
 		}
@@ -156,7 +156,7 @@ namespace NUnit.Core.Tests
 		public void RunAssemblyUsingBeginAndEndRun()
 		{
 			runner.Load(package1);
-			runner.BeginRun( NullListener.NULL );
+			runner.BeginRun( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
 			TestResult result = runner.EndRun();
 			Assert.IsNotNull( result );
 			ResultSummarizer summary = new ResultSummarizer( result );
@@ -167,7 +167,7 @@ namespace NUnit.Core.Tests
 		public void RunMultipleAssemblies()
 		{
 			runner.Load( package2 );
-			TestResult result = runner.Run( NullListener.NULL );
+			TestResult result = runner.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
 			ResultSummarizer summary = new ResultSummarizer(result);
 			Assert.AreEqual( 
 				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
@@ -178,7 +178,7 @@ namespace NUnit.Core.Tests
 		public void RunMultipleAssembliesUsingBeginAndEndRun()
 		{
 			runner.Load( package2 );
-			runner.BeginRun( NullListener.NULL );
+			runner.BeginRun( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
 			TestResult result = runner.EndRun();
 			Assert.IsNotNull( result );
 			ResultSummarizer summary = new ResultSummarizer( result );
diff --git a/src/NUnitCore/tests/CoreExtensionsTests.cs b/src/NUnitCore/tests/CoreExtensionsTests.cs
index 293019e..779a064 100644
--- a/src/NUnitCore/tests/CoreExtensionsTests.cs
+++ b/src/NUnitCore/tests/CoreExtensionsTests.cs
@@ -6,9 +6,11 @@
 using System;
 using System.Text;
 using System.Reflection;
+#if NET_3_5 || NET_4_0
+using NSubstitute;
+#endif
 using NUnit.Framework;
 using NUnit.Core.Extensibility;
-using NUnit.Mocks;
 
 namespace NUnit.Core.Tests
 {
@@ -68,21 +70,6 @@ namespace NUnit.Core.Tests
 			Assert.AreEqual( typeof( FrameworkRegistry ), ep.GetType() );
 		}
 
-		[Test]
-		public void CanAddDecorator()
-		{
-			DynamicMock mock = new DynamicMock( typeof(ITestDecorator) );
-			mock.Expect( "Decorate" );
-
-            IExtensionPoint ep = host.GetExtensionPoint("TestDecorators");
-            ep.Install(mock.MockInstance);
-
-            ITestDecorator decorators = (ITestDecorator)ep;
-            decorators.Decorate(null, null);
-
-			mock.Verify();
-		}
-
         class MockDecorator : ITestDecorator
         {
             private string name;
@@ -101,7 +88,7 @@ namespace NUnit.Core.Tests
             }
         }
 
-	    [Test]
+        [Test]
         public void DecoratorsRunInOrderOfPriorities()
         {
             StringBuilder sb = new StringBuilder();
@@ -132,69 +119,82 @@ namespace NUnit.Core.Tests
             Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
 
             sb.Remove(0, sb.Length);
-	        decorators.Decorate(null, null);
+            decorators.Decorate(null, null);
             Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
         }
 
-	    [Test]
+#if NET_3_5 || NET_4_0
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+		public void CanAddDecorator()
+		{
+            ITestDecorator mockDecorator = Substitute.For<ITestDecorator>();
+
+            IExtensionPoint ep = host.GetExtensionPoint("TestDecorators");
+            ep.Install(mockDecorator);
+
+            ITestDecorator decorators = (ITestDecorator)ep;
+            decorators.Decorate(null, null);
+
+            mockDecorator.Received().Decorate(null, null);
+		}
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
 		public void CanAddSuiteBuilder()
 		{
-			DynamicMock mock = new DynamicMock( typeof(ISuiteBuilder) );
-			mock.ExpectAndReturn( "CanBuildFrom", true, null );
-			mock.Expect( "BuildFrom" );
+            ISuiteBuilder mockBuilder = Substitute.For<ISuiteBuilder>();
+            mockBuilder.CanBuildFrom(Arg.Any<Type>()).Returns(true);
 			
 			IExtensionPoint ep = host.GetExtensionPoint("SuiteBuilders");
-			ep.Install( mock.MockInstance );
+            ep.Install(mockBuilder);
 			ISuiteBuilder builders = (ISuiteBuilder)ep;
 			builders.BuildFrom( null );
 
-			mock.Verify();
+            mockBuilder.Received().BuildFrom(null);
 		}
 
-        [Test]
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
         public void CanAddTestCaseBuilder()
         {
-            DynamicMock mock = new DynamicMock(typeof(ITestCaseBuilder));
-            mock.ExpectAndReturn("CanBuildFrom", true, null);
-            mock.Expect("BuildFrom");
+            ITestCaseBuilder mockBuilder = Substitute.For<ITestCaseBuilder>();
+            mockBuilder.CanBuildFrom(null).Returns(true);
 
             IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
-            ep.Install(mock.MockInstance);
+            ep.Install(mockBuilder);
             ITestCaseBuilder builders = (ITestCaseBuilder)ep;
             builders.BuildFrom(null);
 
-            mock.Verify();
+            mockBuilder.Received().BuildFrom(null);
         }
 
-        [Test]
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
         public void CanAddTestCaseBuilder2()
         {
-            DynamicMock mock = new DynamicMock(typeof(ITestCaseBuilder2));
-            mock.ExpectAndReturn("CanBuildFrom", true, null);
-            mock.Expect("BuildFrom");
+            ITestCaseBuilder2 mockBuilder = Substitute.For<ITestCaseBuilder2>();
+            mockBuilder.CanBuildFrom(null, null).Returns(true);
 
             IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
-            ep.Install(mock.MockInstance);
+            ep.Install(mockBuilder);
             ITestCaseBuilder2 builders = (ITestCaseBuilder2)ep;
             builders.BuildFrom(null, null);
 
-            mock.Verify();
+            mockBuilder.Received().BuildFrom(null, null);
         }
 
-        [Test]
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
 		public void CanAddEventListener()
 		{
-			DynamicMock mock = new DynamicMock( typeof(EventListener) );
-			mock.Expect( "RunStarted" );
-			mock.Expect( "RunFinished" );
+            EventListener mockListener = Substitute.For<EventListener>();
 
 			IExtensionPoint ep = host.GetExtensionPoint("EventListeners");
-			ep.Install( mock.MockInstance );
+			ep.Install( mockListener );
 			EventListener listeners = (EventListener)ep;
+
 			listeners.RunStarted( "test", 0 );
-			listeners.RunFinished( new TestResult( new TestInfo( new TestSuite( "test" ) ) ) );
+            mockListener.Received().RunStarted("test", 0);
 
-			mock.Verify();
+			listeners.RunFinished( new TestResult( new TestInfo( new TestSuite( "test" ) ) ) );
+            mockListener.Received().RunFinished(Arg.Is<TestResult>(x=>x.Name=="test"));
 		}
+#endif
 	}
 }
diff --git a/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs b/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
index 60e241c..dc3b64f 100644
--- a/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
+++ b/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
@@ -136,10 +136,8 @@ namespace NUnit.Core.Tests
 		{
 			TestResult result = TestBuilder.RunTestCase( typeof( InvalidCultureFixture ), "InvalidCultureSet" );
 			Assert.AreEqual( ResultState.Error, result.ResultState );
-            string expectedException = RuntimeFramework.CurrentFramework.ClrVersion.Major == 4
-                ? "System.Globalization.CultureNotFoundException"
-                : "System.ArgumentException";
-            Assert.That(result.Message, Text.StartsWith(expectedException));
+
+            Assert.That(result.Message, Text.StartsWith("System.ArgumentException").Or.StartsWith("System.Globalization.CultureNotFoundException"));
             Assert.That(result.Message, Text.Contains("xx-XX").IgnoreCase);
 		}
 
@@ -153,7 +151,7 @@ namespace NUnit.Core.Tests
 			}
 		}
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test, SetCulture("de-DE")]
         [TestCase(Result="01.06.2010 00:00:00")]
         public string UseWithParameterizedTest()
diff --git a/src/NUnitCore/tests/DatapointTests.cs b/src/NUnitCore/tests/DatapointTests.cs
index 5ea830e..c524c5f 100644
--- a/src/NUnitCore/tests/DatapointTests.cs
+++ b/src/NUnitCore/tests/DatapointTests.cs
@@ -1,5 +1,11 @@
-using System;
-#if NET_2_0
+// ****************************************************************
+// Copyright 2012, 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 CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 using NUnit.Framework;
@@ -43,7 +49,8 @@ namespace NUnit.Core.Tests
             RunTestOnFixture(typeof(SquareRootTest_Method_ArrayOfDouble));
         }
 
-#if NET_2_0 && CS_3_0
+#if CLR_2_0 || CLR_4_0 
+#if CS_3_0 || CS_4_0
         [Test]
         public void WorksOnIEnumerableOfT()
         {
@@ -61,6 +68,13 @@ namespace NUnit.Core.Tests
         {
             RunTestOnFixture(typeof(SquareRootTest_Method_IEnumerableOfDouble));
         }
+
+        [Test]
+        public void WorksOnIteratorReturningIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Iterator_IEnumerableOfDouble));
+        }
+#endif
 #endif
     }
 }
diff --git a/src/NUnitCore/tests/EventQueueTests.cs b/src/NUnitCore/tests/EventQueueTests.cs
index 698f8e3..ee7dfef 100644
--- a/src/NUnitCore/tests/EventQueueTests.cs
+++ b/src/NUnitCore/tests/EventQueueTests.cs
@@ -488,11 +488,7 @@ namespace NUnit.Core.Tests
                 }
                 finally
                 {
-                    consumerThread.Abort();
-                    if ((consumerThread.ThreadState & ThreadState.WaitSleepJoin) != 0)
-                    {
-                        consumerThread.Interrupt();
-                    }
+                    ThreadUtility.Kill(consumerThread);
                 }
 
                 Assert.IsNull(this.myConsumerException);
@@ -614,7 +610,7 @@ namespace NUnit.Core.Tests
             }
             #endregion
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             private static void WriteTrace(string message, params object[] args)
             {
                 Trace.TraceInformation(message, args);
diff --git a/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs b/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
index 22c3168..59d36e3 100644
--- a/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
+++ b/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
@@ -66,7 +66,7 @@ namespace NUnit.Core.Tests
             Assert.AreEqual(1, StaticSetUpAndTearDownFixture.tearDownCount);
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public static void StaticClassSetUpAndTearDownAreCalled()
         {
diff --git a/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs b/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
index d205edd..0f3c990 100644
--- a/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
+++ b/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
@@ -4,7 +4,7 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System;
 using NUnit.Framework;
 
diff --git a/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs b/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
index bb6d3de..a4a1032 100644
--- a/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
+++ b/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
@@ -4,7 +4,7 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System;
 using System.Collections;
 using System.Collections.Generic;
diff --git a/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs b/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
index bca216c..6d06ac8 100644
--- a/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
+++ b/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
@@ -4,7 +4,7 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System;
 using System.Collections.Generic;
 using NUnit.Framework;
diff --git a/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs b/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
index 4f962f4..a8cfcb6 100644
--- a/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
+++ b/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
@@ -4,7 +4,7 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System;
 using NUnit.Framework;
 
diff --git a/src/NUnitCore/tests/IgnoreFixture.cs b/src/NUnitCore/tests/IgnoreFixture.cs
index 37df857..36d2b7e 100644
--- a/src/NUnitCore/tests/IgnoreFixture.cs
+++ b/src/NUnitCore/tests/IgnoreFixture.cs
@@ -73,9 +73,7 @@ namespace NUnit.Core.Tests
 		{
 			TestSuite testFixture = TestBuilder.MakeFixture( typeof( IgnoreInSetUpFixture ) );
             TestResult fixtureResult = testFixture.Run(NullListener.NULL, TestFilter.Empty);
-
-			Assert.IsTrue( fixtureResult.Executed, "Fixture should have been executed" );
-			
+		
 			foreach( TestResult testResult in fixtureResult.Results )
 				Assert.IsFalse( testResult.Executed, "Test case should not have been executed" );
 		}
diff --git a/src/NUnitCore/tests/LegacySuiteTests.cs b/src/NUnitCore/tests/LegacySuiteTests.cs
index 48a821e..60f7f1b 100644
--- a/src/NUnitCore/tests/LegacySuiteTests.cs
+++ b/src/NUnitCore/tests/LegacySuiteTests.cs
@@ -29,7 +29,7 @@ namespace NUnit.Core.Tests
             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);
+            Assert.AreEqual(10, suite.TestCount);
         }
 
         [Test]
@@ -38,7 +38,7 @@ namespace NUnit.Core.Tests
             Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtures));
             Assert.AreEqual(RunState.Runnable, suite.RunState);
             Assert.AreEqual(3, suite.Tests.Count);
-            Assert.AreEqual(11, suite.TestCount);
+            Assert.AreEqual(10, suite.TestCount);
         }
 
         private class LegacySuiteReturningFixtures
@@ -72,7 +72,7 @@ namespace NUnit.Core.Tests
             Test suite = builder.BuildFrom(typeof(LegacySuiteReturningTypes));
             Assert.AreEqual(RunState.Runnable, suite.RunState);
             Assert.AreEqual(3, suite.Tests.Count);
-            Assert.AreEqual(11, suite.TestCount);
+            Assert.AreEqual(10, suite.TestCount);
         }
 
         private class LegacySuiteReturningTypes
diff --git a/src/NUnitCore/tests/MockTestRunner.cs b/src/NUnitCore/tests/MockTestRunner.cs
deleted file mode 100644
index 1adf115..0000000
--- a/src/NUnitCore/tests/MockTestRunner.cs
+++ /dev/null
@@ -1,71 +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
-// ****************************************************************
-
-using System;
-using System.Threading;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Mocks;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for MockTestRunner.
-	/// </summary>
-	public class MockTestRunner : DynamicMock
-	{
-		private Thread runnerThread = null;
-
-		public MockTestRunner() : base( "MockTestRunner", typeof( TestRunner ) ) { }
-
-		public MockTestRunner( string name ) : base( name, typeof( TestRunner ) ) { }
-
-		public Thread RunnerThread
-		{
-			get { return runnerThread; }
-		}
-
-		public override object Call(string methodName, params object[] args)
-		{
-			switch ( methodName )
-			{
-				case "Run":
-					return RunCall( args );
-				default:
-					return base.Call (methodName, args);
-			}
-		}
-
-		private object RunCall( object[] args )
-		{
-			EventListener listener = (EventListener) args[0];
-
-			try
-			{
-				listener.RunStarted( string.Empty, 0 );
-				base.Call( "Run", args );
-				listener.RunFinished( (TestResult)null );
-			}
-			catch( Exception e )
-			{
-				listener.RunFinished( e );
-			}
-
-			return null;
-		}
-
-		public override void Verify()
-		{
-			base.Verify();
-
-			if ( LastException != null )
-				throw LastException;
-
-			if ( runnerThread != null )
-				Assert.IsFalse( Thread.CurrentThread == runnerThread, "Run should execute on a different thread" );
-		}
-	}
-}
diff --git a/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs b/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
index 7c94373..8f3da1a 100644
--- a/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
+++ b/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
@@ -54,7 +54,7 @@ namespace NUnit.Core.Tests
         }
     }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     [TestFixture("A", null)]
     [TestFixture(null, "A")]
     [TestFixture(null, null)]
@@ -95,7 +95,7 @@ namespace NUnit.Core.Tests
             Assert.That(x * y, Is.EqualTo(answer));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         IEnumerable GenerateData()
         {
             for(int i = 1; i <= answer; i++)
diff --git a/src/NUnitCore/tests/PlatformDetectionTests.cs b/src/NUnitCore/tests/PlatformDetectionTests.cs
index 38e3466..5d640c8 100644
--- a/src/NUnitCore/tests/PlatformDetectionTests.cs
+++ b/src/NUnitCore/tests/PlatformDetectionTests.cs
@@ -39,7 +39,7 @@ namespace NUnit.Core.Tests
 			CheckPlatforms(
 				new PlatformHelper( OSPlatform.CurrentPlatform, runtimeFramework ),
 				expectedPlatforms,
-				PlatformHelper.RuntimePlatforms + ",NET-1.0,NET-1.1,NET-2.0,MONO-1.0,MONO-2.0" );
+				PlatformHelper.RuntimePlatforms + ",NET-1.0,NET-1.1,NET-2.0,NET-3.0,NET-3.5,NET-4.0,MONO-1.0,MONO-2.0,MONO-3.0,MONO-3.5,MONO-4.0" );
 		}
 
 		private void CheckPlatforms( PlatformHelper helper, 
@@ -214,18 +214,35 @@ namespace NUnit.Core.Tests
 				"NET,NET-1.1" );
 		}
 
-		[Test]
-		public void DetectNet20()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.Net, new Version( 2, 0, 40607, 0 ) ),
-				"Net,Net-2.0" );
-		}
+        [Test]
+        public void DetectNet20()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Net, new Version(2, 0, 50727, 0)),
+                "Net,Net-2.0");
+        }
+
+        [Test]
+        public void DetectNet30()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Net, new Version(3, 0)),
+                "Net,Net-2.0,Net-3.0");
+        }
+
+        [Test]
+        public void DetectNet35()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Net, new Version(3, 5)),
+                "Net,Net-2.0,Net-3.0,Net-3.5");
+        }
+
         [Test]
         public void DetectNet40()
         {
             CheckRuntimePlatforms(
-                new RuntimeFramework(RuntimeType.Net, new Version(4, 0, 20506, 0)),
+                new RuntimeFramework(RuntimeType.Net, new Version(4, 0, 30319, 0)),
                 "Net,Net-4.0");
         }
 
@@ -253,15 +270,39 @@ namespace NUnit.Core.Tests
 				"Mono,Mono-1.0" );
 		}
 
-		[Test]
-		public void DetectMono20()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.Mono, new Version( 2, 0, 40607, 0 ) ),
-				"Mono,Mono-2.0" );
-		}
+        [Test]
+        public void DetectMono20()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Mono, new Version(2, 0, 50727, 0)),
+                "Mono,Mono-2.0");
+        }
 
-		[Test]
+        [Test]
+        public void DetectMono30()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Mono, new Version(3, 0)),
+                "Mono,Mono-2.0,Mono-3.0");
+        }
+
+        [Test]
+        public void DetectMono35()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Mono, new Version(3, 5)),
+                "Mono,Mono-2.0,Mono-3.0,Mono-3.5");
+        }
+
+        [Test]
+        public void DetectMono40()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Mono, new Version(4, 0, 30319)),
+                "Mono,Mono-4.0");
+        }
+
+        [Test]
 		public void DetectExactVersion()
 		{
 			Assert.IsTrue( winXPHelper.IsPlatformSupported( "net-1.1.4322" ) );
diff --git a/src/NUnitCore/tests/RuntimeFrameworkTests.cs b/src/NUnitCore/tests/RuntimeFrameworkTests.cs
index 9ae3ba2..3073e88 100644
--- a/src/NUnitCore/tests/RuntimeFrameworkTests.cs
+++ b/src/NUnitCore/tests/RuntimeFrameworkTests.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
@@ -39,16 +45,28 @@ namespace NUnit.Core.Tests
             foreach (RuntimeFramework framework in available)
             {
                 Console.WriteLine("Available: {0}", framework.DisplayName);
-                foundCurrent |= RuntimeFramework.CurrentFramework.Matches(framework);
+                foundCurrent |= RuntimeFramework.CurrentFramework.Supports(framework);
             }
             Assert.That(foundCurrent, "CurrentFramework not listed");
         }
 
         [TestCaseSource("frameworkData")]
-        public void CanCreateNewRuntimeFramework(FrameworkData data)
+        public void CanCreateUsingFrameworkVersion(FrameworkData data)
         {
             RuntimeFramework framework = new RuntimeFramework(data.runtime, data.frameworkVersion);
             Assert.AreEqual(data.runtime, framework.Runtime);
+            Assert.AreEqual(data.frameworkVersion, framework.FrameworkVersion);
+            Assert.AreEqual(data.clrVersion, framework.ClrVersion);
+        }
+
+        [TestCaseSource("frameworkData")]
+        public void CanCreateUsingClrVersion(FrameworkData data)
+        {
+            Assume.That(data.frameworkVersion.Major != 3);
+
+            RuntimeFramework framework = new RuntimeFramework(data.runtime, data.clrVersion);
+            Assert.AreEqual(data.runtime, framework.Runtime);
+            Assert.AreEqual(data.frameworkVersion, framework.FrameworkVersion);
             Assert.AreEqual(data.clrVersion, framework.ClrVersion);
         }
 
@@ -71,28 +89,36 @@ namespace NUnit.Core.Tests
         [TestCaseSource("matchData")]
         public bool CanMatchRuntimes(RuntimeFramework f1, RuntimeFramework f2)
         {
-            return f1.Matches(f2);
+            return f1.Supports(f2);
         }
 
         internal static TestCaseData[] matchData = new TestCaseData[] {
             new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
+                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.Net, new Version(2,0,50727))) 
+                new RuntimeFramework(RuntimeType.Net, new Version(3,5))) 
+                .Returns(false),
+            new TestCaseData(
+                new RuntimeFramework(RuntimeType.Net, new Version(3,5)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(3,5))) 
                 .Returns(true),
             new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
+                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(3,5)), 
+                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
                 new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
                 .Returns(true),
             new TestCaseData(
@@ -165,32 +191,34 @@ namespace NUnit.Core.Tests
 
             public override string ToString()
             {
-                return string.Format("<{0}-{1}>", this.runtime, this.frameworkVersion);
+                return string.Format("<{0},{1},{2}>", this.runtime, this.frameworkVersion, this.clrVersion);
             }
         }
 
         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, new Version(1,0), new Version(1,0,3705), "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,0), 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,4322), "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,50727), "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,50727), "net-3.0", "Net 3.0"),
+            new FrameworkData(RuntimeType.Net, new Version(3,5), new Version(2,0,50727), "net-3.5", "Net 3.5"),
+            new FrameworkData(RuntimeType.Net, new Version(4,0), new Version(4,0,30319), "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, new Version(1,0), new Version(1,1,4322), "mono-1.0", "Mono 1.0"),
+            new FrameworkData(RuntimeType.Mono, new Version(2,0), new Version(2,0,50727), "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,50727), "mono-3.5", "Mono 3.5"),
+            new FrameworkData(RuntimeType.Mono, new Version(4,0), new Version(4,0,30319), "mono-4.0", "Mono 4.0"),
             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, new Version(1,1), new Version(1,1,4322), "v1.1", "v1.1"),
+            new FrameworkData(RuntimeType.Any, new Version(2,0), new Version(2,0,50727), "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,50727), "v3.5", "v3.5"),
+            new FrameworkData(RuntimeType.Any, new Version(4,0), new Version(4,0,30319), "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 5653dfa..8498f65 100644
--- a/src/NUnitCore/tests/SerializationBug.cs
+++ b/src/NUnitCore/tests/SerializationBug.cs
@@ -15,7 +15,7 @@ namespace NUnit.Core.Tests
 	[TestFixture]
 	public class SerializationBug
 	{
-		private static readonly string fileName = "perobj.tst";
+		private static readonly string fileName = Path.GetTempFileName();
 
 		[Serializable] 
 		public class Perob 
diff --git a/src/NUnitCore/tests/TestCaseAttributeTests.cs b/src/NUnitCore/tests/TestCaseAttributeTests.cs
index 375ab47..000f808 100644
--- a/src/NUnitCore/tests/TestCaseAttributeTests.cs
+++ b/src/NUnitCore/tests/TestCaseAttributeTests.cs
@@ -79,7 +79,7 @@ namespace NUnit.Core.Tests
             return (sbyte)(x + y);
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [TestCase(Result = null)]
         public object ExpectedResultCanBeNull()
         {
@@ -122,7 +122,7 @@ namespace NUnit.Core.Tests
         }
 
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [TestCase(null, null)]
         public void CanPassNullAsArgument(object a, string b)
         {
@@ -165,12 +165,18 @@ namespace NUnit.Core.Tests
         }
 
         [TestCase("a", "b")]
-        public void HandlesParamsArrayAsSoleArgument(params object[] array)
+        public void HandlesParamsArrayAsSoleArgument(params string[] array)
         {
             Assert.AreEqual("a", array[0]);
             Assert.AreEqual("b", array[1]);
         }
 
+        [TestCase("a")]
+        public void HandlesParamsArrayWithOneItemAsSoleArgument(params string[] array)
+        {
+            Assert.AreEqual("a", array[0]);
+        }
+
         [TestCase("a", "b", "c", "d")]
         public void HandlesParamsArrayAsLastArgument(string s1, string s2, params object[] array)
         {
@@ -180,6 +186,22 @@ namespace NUnit.Core.Tests
             Assert.AreEqual("d", array[1]);
         }
 
+        [TestCase("a", "b")]
+        public void HandlesParamsArrayAsLastArgumentWithNoValues(string s1, string s2, params object[] array)
+        {
+            Assert.AreEqual("a", s1);
+            Assert.AreEqual("b", s2);
+            Assert.AreEqual(0, array.Length);
+        }
+
+        [TestCase("a", "b", "c")]
+        public void HandlesParamsArrayWithOneItemAsLastArgument(string s1, string s2, params object[] array)
+        {
+            Assert.AreEqual("a", s1);
+            Assert.AreEqual("b", s2);
+            Assert.AreEqual("c", array[0]);
+        }
+
         [Test]
         public void CanSpecifyDescription()
         {
@@ -263,16 +285,37 @@ namespace NUnit.Core.Tests
         }
 
         [Test]
-        public void CanIgnoreIndividualTestCase()
+        public void CanIgnoreIndividualTestCases()
         {
             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!"));
+            Test testCase = TestFinder.Find("MethodWithIgnoredTestCases(1)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Runnable));
+
+            testCase = TestFinder.Find("MethodWithIgnoredTestCases(2)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Ignored));
+
+            testCase = TestFinder.Find("MethodWithIgnoredTestCases(3)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Ignored));
+            Assert.That(testCase.IgnoreReason, Is.EqualTo("Don't Run Me!"));
+        }
+
+        [Test]
+        public void CanMarkIndividualTestCasesExplicit()
+        {
+            Test test = TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodWithExplicitTestCases");
+
+            Test testCase = TestFinder.Find("MethodWithExplicitTestCases(1)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Runnable));
+
+            testCase = TestFinder.Find("MethodWithExplicitTestCases(2)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Explicit));
+
+            testCase = TestFinder.Find("MethodWithExplicitTestCases(3)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Explicit));
+            Assert.That(testCase.IgnoreReason, Is.EqualTo("Connection failing"));
         }
     }
 }
diff --git a/src/NUnitCore/tests/TestCaseSourceTests.cs b/src/NUnitCore/tests/TestCaseSourceTests.cs
index 809648f..c9fb16a 100644
--- a/src/NUnitCore/tests/TestCaseSourceTests.cs
+++ b/src/NUnitCore/tests/TestCaseSourceTests.cs
@@ -115,7 +115,7 @@ namespace NUnit.Core.Tests
 
         [Test]
         [TestCaseSource("MyData")]
-        [TestCaseSource("MoreData")]
+        [TestCaseSource("MoreData", Category="Extra")]
         [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
         public void TestMayUseMultipleSourceAttributes(int n, int d, int q)
         {
@@ -135,8 +135,8 @@ namespace NUnit.Core.Tests
             Assert.AreEqual(q, n / d);
         }
 
-        [Test, TestCaseSource(typeof(DivideDataProviderWithReturnValue), "TestCases")]
-        public int SourceMayBeInAnotherClassWithReturn(int n, int d)
+        [Test, TestCaseSource(typeof(DivideDataProviderWithExpectedResult), "TestCases")]
+        public int SourceMayBeInAnotherClassWithExpectedResult(int n, int d)
         {
             return n / d;
         }
@@ -177,6 +177,16 @@ namespace NUnit.Core.Tests
         }
 
         [Test]
+        public void CanSpecifyExpectedException_NoneThrown_ExpectedResultReturned()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsNoExceptionButReturnsResult").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(
@@ -191,12 +201,33 @@ namespace NUnit.Core.Tests
         {
             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 testCase = TestFinder.Find("MethodWithIgnoredTestCases(1)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Runnable));
+
+            testCase = TestFinder.Find("MethodWithIgnoredTestCases(2)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Ignored));
+
+            testCase = TestFinder.Find("MethodWithIgnoredTestCases(3)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Ignored));
+            Assert.That(testCase.IgnoreReason, Is.EqualTo("Don't Run Me!"));
+        }
+
+        [Test]
+        public void CanMarkIndividualTestCasesExplicit()
+        {
+            Test test = TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodWithExplicitTestCases");
+
+            Test testCase = TestFinder.Find("MethodWithExplicitTestCases(1)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Runnable));
+
+            testCase = TestFinder.Find("MethodWithExplicitTestCases(2)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Explicit));
+
+            testCase = TestFinder.Find("MethodWithExplicitTestCases(3)", test, false);
+            Assert.That(testCase.RunState, Is.EqualTo(RunState.Explicit));
+            Assert.That(testCase.IgnoreReason, Is.EqualTo("Connection failing"));
         }
 
         [Test]
@@ -273,7 +304,7 @@ namespace NUnit.Core.Tests
             {
                 get
                 {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                     yield return new TestCaseData(0, 0, 0)
                         .SetName("ThisOneShouldThrow")
                         .SetDescription("Demonstrates use of ExpectedException")
@@ -299,13 +330,14 @@ namespace NUnit.Core.Tests
             }
         }
 
-        public class DivideDataProviderWithReturnValue
+        public class DivideDataProviderWithExpectedResult
         {
             public static IEnumerable TestCases
             {
                 get
                 {
                     return new object[] {
+                        new TestCaseData(12, 0).Throws(typeof(System.DivideByZeroException)),
                         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")
@@ -318,7 +350,7 @@ namespace NUnit.Core.Tests
         {
             get
             {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 yield return new TestCaseData("a", "a");
                 yield return new TestCaseData("b", "b");
 #endif
diff --git a/src/NUnitCore/tests/TestContextTests.cs b/src/NUnitCore/tests/TestContextTests.cs
index 26b0294..a8c51f6 100644
--- a/src/NUnitCore/tests/TestContextTests.cs
+++ b/src/NUnitCore/tests/TestContextTests.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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.TestData.TestContextData;
@@ -39,6 +45,14 @@ namespace NUnit.Core.Tests
         }
 
         [Test]
+        public void TestCanAccessWorkDirectory()
+        {
+            string workDirectory = TestContext.CurrentContext.WorkDirectory;
+            Assert.NotNull(workDirectory);
+            Assert.That(Directory.Exists(workDirectory), string.Format("Directory {0} does not exist", workDirectory));
+        }
+
+        [Test]
         public void TestCanAccessTestState_PassingTest()
         {
             TestStateRecordingFixture fixture = new TestStateRecordingFixture();
diff --git a/src/NUnitCore/tests/TestExecutionContextTests.cs b/src/NUnitCore/tests/TestExecutionContextTests.cs
index 993178a..08769a7 100644
--- a/src/NUnitCore/tests/TestExecutionContextTests.cs
+++ b/src/NUnitCore/tests/TestExecutionContextTests.cs
@@ -140,5 +140,11 @@ namespace NUnit.Core.Tests
             Assert.AreEqual(currentPrincipal, Thread.CurrentPrincipal, "Principal was not restored");
             Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in final context");
         }
+
+        [Test, Explicit("Run this test manually with PrincipalPolicy set to WindowsPrincipal in the advanced loader settings")]
+        public void CanSetPrincipalPolicy()
+        {
+            Assert.That(Thread.CurrentPrincipal is WindowsPrincipal);
+        }
     }
 }
diff --git a/src/NUnitCore/tests/TestFixtureTests.cs b/src/NUnitCore/tests/TestFixtureTests.cs
index e51bb42..d57ad62 100644
--- a/src/NUnitCore/tests/TestFixtureTests.cs
+++ b/src/NUnitCore/tests/TestFixtureTests.cs
@@ -51,11 +51,39 @@ namespace NUnit.Core.Tests
 		}
 
         [Test]
-        public void ConstructFromTypeWithoutTestFixtureAttribute()
+        public void ConstructFromTypeWithoutTestFixtureAttributeContainingTest()
         {
-            TestSuite fixture = TestBuilder.MakeFixture(typeof(FixtureWithoutTestFixtureAttribute));
-            Assert.AreEqual("FixtureWithoutTestFixtureAttribute", fixture.TestName.Name);
-            Assert.AreEqual("NUnit.TestData.TestFixtureData.FixtureWithoutTestFixtureAttribute", fixture.TestName.FullName);
+            TestSuite fixture = TestBuilder.MakeFixture(typeof(FixtureWithoutTestFixtureAttributeContainingTest));
+            Assert.NotNull(fixture, "Unable to construct fixture");
+            Assert.AreEqual("FixtureWithoutTestFixtureAttributeContainingTest", fixture.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestFixtureData.FixtureWithoutTestFixtureAttributeContainingTest", fixture.TestName.FullName);
+        }
+
+        [Test]
+        public void ConstructFromTypeWithoutTestFixtureAttributeContainingTestCase()
+        {
+            TestSuite fixture = TestBuilder.MakeFixture(typeof(FixtureWithoutTestFixtureAttributeContainingTestCase));
+            Assert.NotNull(fixture, "Unable to construct fixture");
+            Assert.AreEqual("FixtureWithoutTestFixtureAttributeContainingTestCase", fixture.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestFixtureData.FixtureWithoutTestFixtureAttributeContainingTestCase", fixture.TestName.FullName);
+        }
+
+        [Test]
+        public void ConstructFromTypeWithoutTestFixtureAttributeContainingTestCaseSource()
+        {
+            TestSuite fixture = TestBuilder.MakeFixture(typeof(FixtureWithoutTestFixtureAttributeContainingTestCaseSource));
+            Assert.NotNull(fixture, "Unable to construct fixture");
+            Assert.AreEqual("FixtureWithoutTestFixtureAttributeContainingTestCaseSource", fixture.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestFixtureData.FixtureWithoutTestFixtureAttributeContainingTestCaseSource", fixture.TestName.FullName);
+        }
+
+        [Test]
+        public void ConstructFromTypeWithoutTestFixtureAttributeContainingTheory()
+        {
+            TestSuite fixture = TestBuilder.MakeFixture(typeof(FixtureWithoutTestFixtureAttributeContainingTheory));
+            Assert.NotNull(fixture, "Unable to construct fixture");
+            Assert.AreEqual("FixtureWithoutTestFixtureAttributeContainingTheory", fixture.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestFixtureData.FixtureWithoutTestFixtureAttributeContainingTheory", fixture.TestName.FullName);
         }
 
         [Test]
@@ -126,13 +154,14 @@ namespace NUnit.Core.Tests
 		public void CanRunMultipleTestFixtureTearDown()
 		{
             TestAssert.IsRunnable(typeof(MultipleFixtureTearDownAttributes));
-		}
+        }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void ConstructFromStaticTypeWithoutTestFixtureAttribute()
         {
             TestSuite fixture = TestBuilder.MakeFixture(typeof(StaticFixtureWithoutTestFixtureAttribute));
+            Assert.NotNull(fixture, "Unable to construct fixture");
             Assert.AreEqual("StaticFixtureWithoutTestFixtureAttribute", fixture.TestName.Name);
             Assert.AreEqual("NUnit.TestData.TestFixtureData.StaticFixtureWithoutTestFixtureAttribute", fixture.TestName.FullName);
         }
diff --git a/src/NUnitCore/tests/TestRunnerThreadTests.cs b/src/NUnitCore/tests/TestRunnerThreadTests.cs
index 4122331..8570324 100644
--- a/src/NUnitCore/tests/TestRunnerThreadTests.cs
+++ b/src/NUnitCore/tests/TestRunnerThreadTests.cs
@@ -4,62 +4,62 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
+#if NET_3_5 || NET_4_0
 using System;
+using System.Threading;
+using NSubstitute;
 using NUnit.Framework;
 using NUnit.Core;
+using NUnit.Core.Filters;
 
 namespace NUnit.Core.Tests
 {
-	[TestFixture]
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
 	public class TestRunnerThreadTests
 	{
-		private MockTestRunner mockRunner;
+		private TestRunner mockRunner;
 		private TestRunnerThread runnerThread;
+        private EventListener listener;
 
 		[SetUp]
 		public void CreateRunnerThread()
 		{
-			mockRunner = new MockTestRunner( "TestRunner" );
-			runnerThread = new TestRunnerThread( (TestRunner)mockRunner.MockInstance );
-			// Set Strict false to avoid faults on the worker thread
-			mockRunner.Strict = false;
+            mockRunner = Substitute.For<TestRunner>();
+			runnerThread = new TestRunnerThread( mockRunner, ApartmentState.Unknown, ThreadPriority.Normal );
+            listener = NullListener.NULL;
 		}
 
 		[Test]
 		public void RunTestSuite()
 		{
-			mockRunner.Expect( "Run" );
-
-			runnerThread.StartRun(NullListener.NULL, null);
+			runnerThread.StartRun(listener, TestFilter.Empty, false, LoggingThreshold.Off);
 			runnerThread.Wait();
 
-			mockRunner.Verify();
+            mockRunner.Received().Run(listener, TestFilter.Empty, false, LoggingThreshold.Off);
 		}
 
-		[Test]
-		public void RunNamedTest()
-		{
-			mockRunner.Expect( "Run" );
-
-			runnerThread.StartRun( NullListener.NULL, new NUnit.Core.Filters.NameFilter( TestName.Parse( "SomeTest" ) ) );
-			runnerThread.Wait();
+        [Test]
+        public void RunNamedTest()
+        {
+            runnerThread.StartRun(listener, new NameFilter(TestName.Parse("SomeTest")), false, LoggingThreshold.Off);
+            runnerThread.Wait();
 
-			mockRunner.Verify();
-		}
+            mockRunner.Received().Run(listener, Arg.Any<NameFilter>(), false, LoggingThreshold.Off);
+        }
 
-		[Test]
-		public void RunMultipleTests()
-		{
-			NUnit.Core.Filters.NameFilter filter = new NUnit.Core.Filters.NameFilter();
-			filter.Add( TestName.Parse( "Test1" ) );
-			filter.Add( TestName.Parse( "Test2" ) );
-			filter.Add( TestName.Parse( "Test3" ) );
-			mockRunner.Expect( "Run" );
+        [Test]
+        public void RunMultipleTests()
+        {
+            NUnit.Core.Filters.NameFilter filter = new NUnit.Core.Filters.NameFilter();
+            filter.Add(TestName.Parse("Test1"));
+            filter.Add(TestName.Parse("Test2"));
+            filter.Add(TestName.Parse("Test3"));
 
-			runnerThread.StartRun( NullListener.NULL, filter );
-			runnerThread.Wait();
+            runnerThread.StartRun(listener, filter, false, LoggingThreshold.Off);
+            runnerThread.Wait();
 
-			mockRunner.Verify();
-		}
+            mockRunner.Received().Run(listener, filter, false, LoggingThreshold.Off);
+        }
 	}
 }
+#endif
diff --git a/src/NUnitCore/tests/ThreadedTestRunnerTests.cs b/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
index 92382a4..3f3f11d 100644
--- a/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
+++ b/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
@@ -5,6 +5,7 @@
 // ****************************************************************
 
 using System;
+using System.Threading;
 using NUnit.Framework;
 
 namespace NUnit.Core.Tests
@@ -17,7 +18,7 @@ namespace NUnit.Core.Tests
 	{
 		protected override TestRunner CreateRunner( int runnerID )
 		{
-			return new ThreadedTestRunner( new SimpleTestRunner( runnerID ) );
+			return new ThreadedTestRunner( new SimpleTestRunner( runnerID ), ApartmentState.Unknown, ThreadPriority.Normal );
 		}
 
 	}
diff --git a/src/NUnitCore/tests/ThreadingTests.cs b/src/NUnitCore/tests/ThreadingTests.cs
index 655f5ef..74128ba 100644
--- a/src/NUnitCore/tests/ThreadingTests.cs
+++ b/src/NUnitCore/tests/ThreadingTests.cs
@@ -47,10 +47,13 @@ namespace NUnit.Core.Tests
         [Test]
         public void TestWithInfiniteLoopTimesOut()
         {
-            TestResult result = TestBuilder.RunTestCase(
-                typeof(ThreadingFixture), "InfiniteLoopWith50msTimeout");
+            ThreadingFixture fixture = new ThreadingFixture();
+            TestSuite suite = TestBuilder.MakeFixture(fixture);
+            Test test = TestFinder.Find("InfiniteLoopWith50msTimeout", suite, false);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
             Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
             Assert.That(result.Message, Text.Contains("50ms"));
+            Assert.That(fixture.TearDownWasRun, "TearDown was not executed");
         }
 
         [Test, STAThread]
diff --git a/src/NUnitCore/tests/TypeHelperTests.cs b/src/NUnitCore/tests/TypeHelperTests.cs
index 8c93c75..c690236 100644
--- a/src/NUnitCore/tests/TypeHelperTests.cs
+++ b/src/NUnitCore/tests/TypeHelperTests.cs
@@ -1,5 +1,11 @@
-using System;
-#if NET_2_0
+// ****************************************************************
+// Copyright 2012, 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 CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 using NUnit.Framework;
@@ -13,7 +19,7 @@ namespace NUnit.Core.Tests
         [TestCase(typeof(int), "Int32")]
         [TestCase(typeof(SimpleClass), "SimpleClass")]
         [TestCase(typeof(MyNoNamespaceClass), "MyNoNamespaceClass")]
-#if NET_2_0
+#if CLR_2_0 || CLR_4_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")]
diff --git a/src/NUnitCore/tests/ValueSourceTests.cs b/src/NUnitCore/tests/ValueSourceTests.cs
index edafe95..2e133a1 100644
--- a/src/NUnitCore/tests/ValueSourceTests.cs
+++ b/src/NUnitCore/tests/ValueSourceTests.cs
@@ -8,7 +8,7 @@ using NUnit.Framework;
 using NUnit.TestData;
 using NUnit.TestUtilities;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -26,9 +26,9 @@ namespace NUnit.Core.Tests
 
         static IEnumerable StaticProperty
         {
-            get 
+            get
             {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 yield return "StaticProperty";
 #else
                 return new object[] { "StaticProperty" }; 
@@ -134,7 +134,7 @@ namespace NUnit.Core.Tests
             internal static int[] Quotients = new int[] { 4, 3, 2 };
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void ValueSourceMayBeGeneric(
             [ValueSourceAttribute(typeof(ValueProvider), "IntegerProvider")] int val)
diff --git a/src/NUnitCore/tests/XmlTest.cs b/src/NUnitCore/tests/XmlTest.cs
index d4ef5ec..fe5b0d6 100644
--- a/src/NUnitCore/tests/XmlTest.cs
+++ b/src/NUnitCore/tests/XmlTest.cs
@@ -126,7 +126,7 @@ namespace NUnit.Core.Tests
 		[SetUp]
 		public void CreateTempFileName()
 		{
-			tempFile = "temp" + Guid.NewGuid().ToString() + ".xml";
+            tempFile = Path.GetTempFileName();
 			schemaFile = new TempResourceFile( GetType(), "Results.xsd");
 		}
 
diff --git a/src/NUnitCore/tests/nunit.core.tests.build b/src/NUnitCore/tests/nunit.core.tests.build
index 6392e0c..8e01bc0 100644
--- a/src/NUnitCore/tests/nunit.core.tests.build
+++ b/src/NUnitCore/tests/nunit.core.tests.build
@@ -6,6 +6,8 @@
         <include name="Generic/SimpleGenericFixture.cs"/>
         <include name="Generic/SimpleGenericMethods.cs"/>
         <include name="Generic/TypeParameterUsedWithTestMethod.cs"/>
+    <include name="ActionAttributeExceptionTests.cs"/>
+    <include name="ActionAttributeTests.cs"/>
         <include name="AllTests.cs"/>
         <include name="AssemblyHelperTests.cs"/>
         <include name="AssemblyReaderTests.cs"/>
@@ -103,6 +105,7 @@
         <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}/NSubstitute.dll" if="${runtime.version >= '3.5'}"/>
         <include name="${current.test.dir}/test-assembly.dll"/>
         <include name="${current.test.dir}/test-utilities.dll"/>
         <include name="${current.test.dir}/mock-assembly.dll"/>
diff --git a/src/NUnitCore/tests/nunit.core.tests.csproj b/src/NUnitCore/tests/nunit.core.tests.csproj
index 827499c..927ed83 100644
--- a/src/NUnitCore/tests/nunit.core.tests.csproj
+++ b/src/NUnitCore/tests/nunit.core.tests.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -37,14 +37,14 @@
     <IsWebBootstrapper>true</IsWebBootstrapper>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v3.5</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>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -62,7 +62,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -78,6 +78,9 @@
     <Reference Include="System">
       <Name>System</Name>
     </Reference>
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
     <Reference Include="System.Data">
       <Name>System.Data</Name>
     </Reference>
@@ -93,11 +96,6 @@
       <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>
@@ -126,11 +124,16 @@
       <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
       <Private>False</Private>
     </ProjectReference>
+    <Reference Include="NSubstitute">
+      <HintPath>..\..\..\lib\3.5\NSubstitute.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\..\CommonAssemblyInfo.cs">
       <Link>CommonAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="ActionAttributeExceptionTests.cs" />
+    <Compile Include="ActionAttributeTests.cs" />
     <Compile Include="AllTests.cs" />
     <Compile Include="AssemblyHelperTests.cs" />
     <Compile Include="AssemblyReaderTests.cs" />
@@ -160,7 +163,6 @@
     <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" />
diff --git a/src/NUnitFixtures/fixtures/AssemblyRunner.cs b/src/NUnitFixtures/fixtures/AssemblyRunner.cs
deleted file mode 100644
index 9efa3b5..0000000
--- a/src/NUnitFixtures/fixtures/AssemblyRunner.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
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Fixtures
-{
-	/// <summary>
-	/// Summary description for AssemblyRunner.
-	/// </summary>
-	public class AssemblyRunner : TestLoadFixture
-	{
-		public string Assembly;
-
-		// Override doCell to handle the 'Code' column. We compile
-		// the code and optionally load and run the tests.
-		public override void doCell(fit.Parse cell, int columnNumber)
-		{
-			base.doCell (cell, columnNumber);
-
-			FieldInfo field = columnBindings[columnNumber].field;
-			if ( field != null && field.Name == "Assembly" )
-				LoadAndRunTestAssembly( cell, Assembly );
-		}
-	}
-}
diff --git a/src/NUnitFixtures/fixtures/PlatformInfo.cs b/src/NUnitFixtures/fixtures/PlatformInfo.cs
deleted file mode 100644
index 84027bd..0000000
--- a/src/NUnitFixtures/fixtures/PlatformInfo.cs
+++ /dev/null
@@ -1,36 +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
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Fixtures
-{
-	/// <summary>
-	/// PlatformFixture simply displays info about the platform
-	/// we are running on.
-	/// </summary>
-	public class PlatformInfo : fit.Fixture
-	{
-		public override void doTable(fit.Parse table)
-		{
-			table.parts.more =
-				tr( td( "platform", td( Environment.OSVersion.ToString(), null ) ),
-				tr( td( "clrVersion", td( Environment.Version.ToString(), null ) ),
-				null ) );
-				
-		}
-
-		private fit.Parse tr( fit.Parse parts, fit.Parse more) 
-		{
-			return new fit.Parse ("tr", null, parts, more);
-		}
-
-		private fit.Parse td(string body, fit.Parse more) 
-		{
-			return new fit.Parse ("td", info(body), null, more);
-		}
-	}
-}
diff --git a/src/NUnitFixtures/fixtures/SnippetRunner.cs b/src/NUnitFixtures/fixtures/SnippetRunner.cs
deleted file mode 100644
index 8e8583a..0000000
--- a/src/NUnitFixtures/fixtures/SnippetRunner.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
-// ****************************************************************
-
-using System;
-using System.Text;
-using System.Reflection;
-using System.Collections;
-using System.CodeDom.Compiler;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.Fixtures
-{
-	/// <summary>
-	/// Abstract base class for fixtures that compile a snippet of code.
-	/// The fixture is basically a column fixture with one input column
-	/// dedicated to containing the code that is to be compiled. This
-	/// will normally be the first column
-	/// </summary>
-	public class SnippetRunner : TestLoadFixture
-	{
-		public string Code;
-
-		private static readonly string testAssembly = "test.dll";
-
-		// Override doCell to handle the 'Code' column. We compile
-		// the code and optionally load and run the tests.
-		public override void doCell(fit.Parse cell, int columnNumber)
-		{
-			base.doCell (cell, columnNumber);
-
-			FieldInfo field = columnBindings[columnNumber].field;
-			if ( field != null && field.Name == "Code" && CompileCodeSnippet( cell, Code ) )
-				LoadAndRunTestAssembly( cell, testAssembly );
-		}
-
-		private bool CompileCodeSnippet( fit.Parse cell, string code )
-		{
-			TestCompiler compiler = new TestCompiler( 
-				new string[] { "system.dll", "nunit.framework.dll" }, 
-				testAssembly );
-
-			CompilerResults results = compiler.CompileCode( code );
-			if ( results.NativeCompilerReturnValue == 0 )
-				return true;
-
-			cell.addToBody( "<font size=-1 color=\"#c08080\"><i>Compiler errors</i></font>" );
-
-			wrong( cell );
-			cell.addToBody( "<hr>" );
-				
-			foreach( string line in results.Output )
-				cell.addToBody( line + "<br>" );
-
-			return true;
-		}
-
-		public TestTree Tree()
-		{
-			if ( testRunner.Test == null )
-				return new TestTree( "NULL" );
-
-			if ( testRunner.Test.Tests.Count == 0 )
-				return new TestTree( "EMPTY" );
-
-			StringBuilder sb = new StringBuilder();
-			AppendTests( sb, "", testRunner.Test.Tests );
-
-			return new TestTree( sb.ToString() );
-		}
-
-		private void AppendTests( StringBuilder sb, string prefix, IList tests )
-		{
-			foreach( TestNode test in tests )
-			{
-				sb.Append( prefix );
-				sb.Append( test.TestName.Name );
-				sb.Append( Environment.NewLine );
-				if ( test.Tests != null )
-					AppendTests( sb, prefix + ">", test.Tests );
-			}
-		}
-	}
-}
diff --git a/src/NUnitFixtures/fixtures/TestCompiler.cs b/src/NUnitFixtures/fixtures/TestCompiler.cs
deleted file mode 100644
index 0443c72..0000000
--- a/src/NUnitFixtures/fixtures/TestCompiler.cs
+++ /dev/null
@@ -1,59 +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
-// ****************************************************************
-
-using System;
-using System.CodeDom.Compiler;
-
-namespace NUnit.Fixtures
-{
-	/// <summary>
-	/// Summary description for CSharpCompiler.
-	/// </summary>
-	public 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/NUnitFixtures/fixtures/TestLoadFixture.cs b/src/NUnitFixtures/fixtures/TestLoadFixture.cs
deleted file mode 100644
index 4672b4e..0000000
--- a/src/NUnitFixtures/fixtures/TestLoadFixture.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
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Text;
-using System.Collections;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.Fixtures
-{
-	/// <summary>
-	/// Abstract base class for fixtures that load and run a test assembly.
-	/// </summary>
-	public abstract class TestLoadFixture : fit.ColumnFixture
-	{
-		protected TestRunner testRunner;
-		protected TestResult testResult;
-		protected ResultSummarizer testSummary;
-
-		protected void LoadAndRunTestAssembly( fit.Parse cell, string testAssembly )
-		{
-			testRunner = new TestDomain();
-
-			if ( !testRunner.Load( new TestPackage(testAssembly) ) )
-			{
-				this.wrong(cell);
-				cell.addToBody( string.Format( 
-					"<font size=-1 color=\"#c08080\"> <i>Failed to load {0}</i></font>", testAssembly ) );
-
-				return;
-			}
-
-			testResult = testRunner.Run(NullListener.NULL);
-			testSummary = new ResultSummarizer( testResult );
-
-			this.right( cell );
-		}
-
-		public override void wrong(fit.Parse cell)
-		{
-			string body = cell.body;
-			base.wrong (cell);
-			cell.body = body;
-		}
-
-		public int Skipped()
-		{
-			return testRunner.Test.TestCount - testSummary.TestsRun - testSummary.Ignored;
-		}
-
-		public int Tests()
-		{
-			return testRunner.Test.TestCount;
-		}
-
-		public int Run()
-		{
-			return testSummary.TestsRun;
-		}
-
-		public int Failures()
-		{
-			return testSummary.Failures;
-		}
-
-		public int Ignored()
-		{
-			return testSummary.Ignored;
-		}
-	}
-}
diff --git a/src/NUnitFixtures/fixtures/TestTree.cs b/src/NUnitFixtures/fixtures/TestTree.cs
deleted file mode 100644
index 092193b..0000000
--- a/src/NUnitFixtures/fixtures/TestTree.cs
+++ /dev/null
@@ -1,52 +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
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Fixtures
-{
-	/// <summary>
-	/// TestTree provides a simple, character-based representation of
-	/// a loaded tree of tests and is used for comparing actual and
-	/// expected tree values.
-	/// </summary>
-	public class TestTree
-	{
-		string display;
-		string signature;
-
-		public static TestTree Parse( string display )
-		{
-			return new TestTree( display );
-		}
-
-		public TestTree( string display )
-		{
-			this.display = display;
-			this.signature = display.Trim().Replace( Environment.NewLine, "+" ).Replace( " ", "+" );
-		}
-
-		public override string ToString()
-		{
-			return this.display;
-		}
-
-		public override bool Equals(object obj)
-		{
-			bool ok = obj is TestTree && ((TestTree)obj).signature == this.signature;
-//			System.Diagnostics.Debug.Assert( ok );
-			return ok;
-		}
-
-		public override int GetHashCode()
-		{
-			return signature.GetHashCode ();
-		}
-
-
-
-	}
-}
diff --git a/src/NUnitFixtures/fixtures/nunit.fixtures.build b/src/NUnitFixtures/fixtures/nunit.fixtures.build
deleted file mode 100644
index d43b5ee..0000000
--- a/src/NUnitFixtures/fixtures/nunit.fixtures.build
+++ /dev/null
@@ -1,52 +0,0 @@
-<?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.lib.dir}/nunit.fixtures.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources >
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618" if="${runtime.version=='2.0'}"/>
-      </nowarn>
-      <references basedir="${current.lib.dir}">
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="fit.dll"/>
-      </references>
-    </csc>
-
-    <copy todir="${current.build.dir}">
-      <fileset basedir="${project.tools.dir}/fit">
-        <include name="runFile.exe"/>
-        <include name="runFile.exe.config"/>
-      </fileset>
-    </copy>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitFixtures/fixtures">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit.fixtures.csproj"/>
-        <include name="nunit.fixtures.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/NUnitFixtures/fixtures/nunit.fixtures.csproj b/src/NUnitFixtures/fixtures/nunit.fixtures.csproj
deleted file mode 100644
index c09a127..0000000
--- a/src/NUnitFixtures/fixtures/nunit.fixtures.csproj
+++ /dev/null
@@ -1,111 +0,0 @@
-<?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/tests/CompilationTests.cs b/src/NUnitFixtures/tests/CompilationTests.cs
deleted file mode 100644
index dfd489e..0000000
--- a/src/NUnitFixtures/tests/CompilationTests.cs
+++ /dev/null
@@ -1,100 +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
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.CodeDom.Compiler;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.Fixtures.Tests
-{
-	/// <summary>
-	/// Summary description for CompilationTests.
-	/// </summary>
-	[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 = Path.GetFullPath("test.dll");
-		private static string goodCode = 
-@"using System;
-using NUnit.Framework;
-
-namespace My.Namespace
-{
-    [TestFixture] public class SomeClass
-    {
-		[Test] public void ThisMethod() { }
-		[Test] public void ThatMethod() { }
-	}
-}";
-
-		[SetUp]
-		public void CreateCompiler()
-		{
-			this.compiler = new TestCompiler( references, outputName );
-		}
-
-		[TearDown]
-		public void RemoveOutputFile()
-		{
-			if ( File.Exists( outputName ) )
-				File.Delete( outputName );
-		}
-
-		[Test]
-		public void CheckDefaultSettings()
-		{
-			CollectionAssert.AreEqual( references, compiler.Options.ReferencedAssemblies );
-			Assert.AreEqual( outputName, compiler.Options.OutputAssembly );
-
-			Assert.IsFalse( compiler.Options.IncludeDebugInformation, "IncludeDebugInformation" );
-			Assert.IsFalse( compiler.Options.GenerateInMemory, "GenerateInMemory" );
-			Assert.IsFalse( compiler.Options.GenerateExecutable, "GenerateExecutable" );
-		}
-
-		[Test]
-		public void CompileToFile()
-		{
-			CompilerResults results = compiler.CompileCode( goodCode );
-			Assert.AreEqual( 0, results.NativeCompilerReturnValue );
-			Assert.IsNotNull( results.CompiledAssembly );
-			Assert.IsTrue( File.Exists( outputName ) );
-		}
-
-		[Test]
-		public void CompilingBadCodeGivesAnError()
-		{
-			string badCode = goodCode.Replace( "void", "vide" );
-		    Assert.AreNotEqual( 0, compiler.CompileCode( badCode ).NativeCompilerReturnValue );
-		}
-
-		[Test]
-		public void LoadTestsFromCompiledAssembly()
-		{
-			CompilerResults results = compiler.CompileCode( goodCode );
-			Assert.AreEqual( 0, results.NativeCompilerReturnValue );
-
-			TestRunner runner = new SimpleTestRunner();
-
-			try
-			{
-				Assert.IsTrue( runner.Load( new TestPackage( outputName ) ) );
-				Assert.AreEqual( 2, runner.Test.TestCount );
-			}
-			finally
-			{
-				runner.Unload();
-			}
-		}
-	}
-}
diff --git a/src/NUnitFixtures/tests/TestTreeTests.cs b/src/NUnitFixtures/tests/TestTreeTests.cs
deleted file mode 100644
index b0c0673..0000000
--- a/src/NUnitFixtures/tests/TestTreeTests.cs
+++ /dev/null
@@ -1,53 +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
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Fixtures.Tests
-{
-	/// <summary>
-	/// Summary description for TestTreeTests.
-	/// </summary>
-	[TestFixture]
-	public class TestTreeTests
-	{
-		static TestTree tree1 = new TestTree(
-			"SomeClass" + Environment.NewLine +
-			">Test1" + Environment.NewLine +
-			">Test2" + Environment.NewLine +
-			">Test3" + Environment.NewLine +
-			"AnotherClass" + Environment.NewLine +
-			">Test4" + Environment.NewLine +
-			">Test5" );
-
-		static TestTree tree2 = new TestTree(
-			"SomeClass >Test1 >Test2 >Test3" + Environment.NewLine +
-			"AnotherClass >Test4 >Test5" );
-
-		static TestTree tree3 = new TestTree(
-			"SomeClass >Test1 >Test2 >Test3 AnotherClass >Test4 >Test5" );
-
-		static TestTree tree4 = new TestTree(
-			"SomeClass >Test1 >TestX >Test3 AnotherClass >Test4 >Test5" );
-
-		[Test]
-		public void MatchingTreesAreEqual()
-		{
-			Assert.AreEqual( tree1, tree1 ); 
-			Assert.AreEqual( tree1, tree2 ); 
-			Assert.AreEqual( tree1, tree3 ); 
-		}
-
-		[Test]
-		public void NonMatchingTreesAreNotEqual()
-		{
-			Assert.AreNotEqual( tree1, tree4 ); 
-			Assert.AreNotEqual( tree2, tree4 ); 
-			Assert.AreNotEqual( tree3, tree4 ); 
-		}
-	}
-}
diff --git a/src/NUnitFixtures/tests/nunit.fixtures.tests.build b/src/NUnitFixtures/tests/nunit.fixtures.tests.build
deleted file mode 100644
index 7cb7fd0..0000000
--- a/src/NUnitFixtures/tests/nunit.fixtures.tests.build
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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.test.dir}/nunit.fixtures.tests.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <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>
-        <patternset refid="source-files"/>
-        <include name="nunit.fixtures.tests.csproj"/>
-        <include name="nunit.fixtures.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj b/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj
deleted file mode 100644
index 317b99d..0000000
--- a/src/NUnitFixtures/tests/nunit.fixtures.tests.csproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?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/NUnitFramework/framework/ActionTargets.cs b/src/NUnitFramework/framework/ActionTargets.cs
new file mode 100644
index 0000000..fbf0b7d
--- /dev/null
+++ b/src/NUnitFramework/framework/ActionTargets.cs
@@ -0,0 +1,34 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The different targets a test action attribute can be applied to
+    /// </summary>
+    [Flags]
+    public enum ActionTargets
+    {
+        /// <summary>
+        /// Default target, which is determined by where the action attribute is attached
+        /// </summary>
+        Default = 0,
+
+        /// <summary>
+        /// Target a individual test case
+        /// </summary>
+        Test = 1,
+
+        /// <summary>
+        /// Target a suite of test cases
+        /// </summary>
+        Suite = 2
+    }
+}
+#endif
diff --git a/src/NUnitFramework/framework/AssemblyInfo.cs b/src/NUnitFramework/framework/AssemblyInfo.cs
index d08af6e..e86d58b 100644
--- a/src/NUnitFramework/framework/AssemblyInfo.cs
+++ b/src/NUnitFramework/framework/AssemblyInfo.cs
@@ -6,8 +6,10 @@
 
 using System;
 using System.Reflection;
+using System.Security;
 
 [assembly: CLSCompliant(true)]
+[assembly: AllowPartiallyTrustedCallers]
 
 [assembly: AssemblyDelaySign(false)]
 [assembly: AssemblyKeyFile("../../nunit.snk")]
diff --git a/src/NUnitFramework/framework/Assert.cs b/src/NUnitFramework/framework/Assert.cs
index 4ec1af4..2258880 100644
--- a/src/NUnitFramework/framework/Assert.cs
+++ b/src/NUnitFramework/framework/Assert.cs
@@ -4,14 +4,6 @@
 // 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;
@@ -369,7 +361,7 @@ namespace NUnit.Framework
         #endregion
 
         #region ref Object
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Apply a constraint to a referenced value, succeeding if the constraint
         /// is satisfied and throwing an assertion exception on failure.
@@ -414,49 +406,49 @@ namespace NUnit.Framework
             }
         }
 #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 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>
-        /// <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();
+            /// <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);
+            }
 
-            Assert.IncrementAssertCount();
-            if (!constraint.Matches(ref actual))
+            /// <summary>
+            /// Apply a constraint to a referenced value, succeeding if the constraint
+            /// is satisfied and throwing an assertion exception on failure.
+            /// </summary>
+            /// <param name="actual">The actual value to test</param>
+            /// <param name="expression">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(ref bool actual, IResolveConstraint expression, string message, params object[] args)
             {
-                MessageWriter writer = new TextMessageWriter(message, args);
-                constraint.WriteMessageTo(writer);
-                throw new AssertionException(writer.ToString());
+                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
 
@@ -507,6 +499,54 @@ namespace NUnit.Framework
         }
         #endregion
 
+        #region Assert.ByVal
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// Used as a synonym for That in rare cases where a private setter 
+        /// causes a Visual Basic compilation error.
+        /// </summary>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void ByVal(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.
+        /// Used as a synonym for That in rare cases where a private setter 
+        /// causes a Visual Basic compilation error.
+        /// </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 ByVal(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. 
+        /// Used as a synonym for That in rare cases where a private setter 
+        /// causes a Visual Basic compilation error.
+        /// </summary>
+        /// <remarks>
+        /// This method is provided for use by VB developers needing to test
+        /// the value of properties with private setters.
+        /// </remarks>
+        /// <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 ByVal(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Assert.That(actual, expression, message, args);
+        }
+        #endregion
+
         #region Throws, Catch and DoesNotThrow
 
         #region Throws
@@ -525,7 +565,7 @@ namespace NUnit.Framework
             {
                 code();
             }
-            catch(Exception ex)
+            catch (Exception ex)
             {
                 caughtException = ex;
             }
@@ -565,7 +605,7 @@ namespace NUnit.Framework
         /// <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);
+            return Throws(new ExceptionTypeConstraint(expectedExceptionType), code, message, args);
         }
 
         /// <summary>
@@ -576,7 +616,7 @@ namespace NUnit.Framework
         /// <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);
+            return Throws(new ExceptionTypeConstraint(expectedExceptionType), code, message, null);
         }
 
         /// <summary>
@@ -586,13 +626,13 @@ namespace NUnit.Framework
         /// <param name="code">A TestSnippet delegate</param>
         public static Exception Throws(Type expectedExceptionType, TestDelegate code)
         {
-            return Throws(new ExactTypeConstraint(expectedExceptionType), code, string.Empty, null);
+            return Throws(new ExceptionTypeConstraint(expectedExceptionType), code, string.Empty, null);
         }
 
         #endregion
 
         #region Throws<T>
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Verifies that a delegate throws a particular exception when called.
         /// </summary>
@@ -696,11 +736,11 @@ namespace NUnit.Framework
         public static Exception Catch(Type expectedExceptionType, TestDelegate code)
         {
             return Throws(new InstanceOfTypeConstraint(expectedExceptionType), code);
-        }       
+        }
         #endregion
 
         #region Catch<T>
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Verifies that a delegate throws an exception of a certain Type
         /// or one derived from it when called and returns it.
@@ -785,7 +825,7 @@ namespace NUnit.Framework
         #endregion
 
         #region True
-        
+
         /// <summary>
         /// Asserts that a condition is true. If the condition is false the method throws
         /// an <see cref="AssertionException"/>.
@@ -795,9 +835,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -806,9 +845,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -816,9 +854,9 @@ namespace NUnit.Framework
         /// <param name="condition">The evaluated condition</param>
         public static void True(bool condition)
         {
-            Assert.That(condition, Is.True ,null, null);
+            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"/>.
@@ -828,9 +866,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -839,9 +876,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -849,13 +885,13 @@ namespace NUnit.Framework
         /// <param name="condition">The evaluated condition</param>
         public static void IsTrue(bool condition)
         {
-            Assert.That(condition, Is.True ,null, null);
+            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"/>.
@@ -865,9 +901,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -876,9 +911,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -886,9 +920,9 @@ namespace NUnit.Framework
         /// <param name="condition">The evaluated condition</param>
         public static void False(bool condition)
         {
-            Assert.That(condition, Is.False ,null, null);
+            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"/>.
@@ -898,9 +932,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -909,9 +942,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>.
@@ -919,13 +951,13 @@ namespace NUnit.Framework
         /// <param name="condition">The evaluated condition</param>
         public static void IsFalse(bool condition)
         {
-            Assert.That(condition, Is.False ,null, null);
+            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"/>
@@ -936,9 +968,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -948,9 +979,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -959,9 +989,9 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -972,9 +1002,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -984,9 +1013,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -995,13 +1023,13 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1012,9 +1040,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1024,9 +1051,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1035,9 +1061,9 @@ namespace NUnit.Framework
         /// <param name="anObject">The object that is to be tested</param>
         public static void Null(object anObject)
         {
-            Assert.That(anObject, Is.Null ,null, null);
+            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"/>
@@ -1048,9 +1074,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1060,9 +1085,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1071,13 +1095,13 @@ namespace NUnit.Framework
         /// <param name="anObject">The object that is to be tested</param>
         public static void IsNull(object anObject)
         {
-            Assert.That(anObject, Is.Null ,null, null);
+            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"/>
@@ -1088,9 +1112,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1100,9 +1123,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1111,10 +1133,10 @@ namespace NUnit.Framework
         /// <param name="aDouble">The value that is to be tested</param>
         public static void IsNaN(double aDouble)
         {
-            Assert.That(aDouble, Is.NaN ,null, null);
+            Assert.That(aDouble, Is.NaN, null, null);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_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"/>
@@ -1125,9 +1147,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1137,9 +1158,8 @@ namespace NUnit.Framework
         /// <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);
+            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"/>
@@ -1148,14 +1168,14 @@ namespace NUnit.Framework
         /// <param name="aDouble">The value that is to be tested</param>
         public static void IsNaN(double? aDouble)
         {
-            Assert.That(aDouble, Is.NaN ,null, null);
+            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>
@@ -1164,9 +1184,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(aString, new EmptyStringConstraint(), message, args);
         }
-        
         /// <summary>
         /// Assert that a string is empty - that is equal to string.Empty
         /// </summary>
@@ -1174,56 +1193,53 @@ namespace NUnit.Framework
         /// <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);
+            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);
+            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)
+        public static void IsEmpty(IEnumerable collection, string message, params object[] args)
         {
-            Assert.That(collection, new EmptyCollectionConstraint() ,message, 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)
+        public static void IsEmpty(IEnumerable collection, string message)
         {
-            Assert.That(collection, new EmptyCollectionConstraint() ,message, null);
+            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)
+        public static void IsEmpty(IEnumerable collection)
         {
-            Assert.That(collection, new EmptyCollectionConstraint() ,null, null);
+            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>
@@ -1232,9 +1248,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(aString, Is.Not.Empty, message, args);
         }
-        
         /// <summary>
         /// Assert that a string is not empty - that is not equal to string.Empty
         /// </summary>
@@ -1242,56 +1257,53 @@ namespace NUnit.Framework
         /// <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);
+            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);
+            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)
+        public static void IsNotEmpty(IEnumerable collection, string message, params object[] args)
         {
-            Assert.That(collection, Is.Not.Empty ,message, 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)
+        public static void IsNotEmpty(IEnumerable collection, string message)
         {
-            Assert.That(collection, Is.Not.Empty ,message, null);
+            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)
+        public static void IsNotEmpty(IEnumerable collection)
         {
-            Assert.That(collection, Is.Not.Empty ,null, null);
+            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>
@@ -1300,9 +1312,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(aString, new NullOrEmptyStringConstraint(), message, args);
         }
-        
         /// <summary>
         /// Assert that a string is either null or equal to string.Empty
         /// </summary>
@@ -1310,22 +1321,21 @@ namespace NUnit.Framework
         /// <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);
+            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);
+            Assert.That(aString, new NullOrEmptyStringConstraint(), null, null);
         }
-        
+
         #endregion
-        
+
         #region IsNotNullOrEmpty
-        
+
         /// <summary>
         /// Assert that a string is not null or empty
         /// </summary>
@@ -1334,9 +1344,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), message, args);
         }
-        
         /// <summary>
         /// Assert that a string is not null or empty
         /// </summary>
@@ -1344,22 +1353,21 @@ namespace NUnit.Framework
         /// <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);
+            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);
+            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>
@@ -1369,9 +1377,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.AssignableFrom(expected), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object may be assigned a  value of a given Type.
         /// </summary>
@@ -1380,9 +1387,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.AssignableFrom(expected), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object may be assigned a  value of a given Type.
         /// </summary>
@@ -1390,14 +1396,14 @@ namespace NUnit.Framework
         /// <param name="actual">The object under examination</param>
         public static void IsAssignableFrom(Type expected, object actual)
         {
-            Assert.That(actual, Is.AssignableFrom(expected) ,null, null);
+            Assert.That(actual, Is.AssignableFrom(expected), null, null);
         }
-        
+
         #endregion
-        
+
         #region IsAssignableFrom<T>
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Asserts that an object may be assigned a  value of a given Type.
         /// </summary>
@@ -1407,9 +1413,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.AssignableFrom(typeof(T)), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object may be assigned a  value of a given Type.
         /// </summary>
@@ -1418,9 +1423,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.AssignableFrom(typeof(T)), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object may be assigned a  value of a given Type.
         /// </summary>
@@ -1428,14 +1432,14 @@ namespace NUnit.Framework
         /// <param name="actual">The object under examination</param>
         public static void IsAssignableFrom<T>(object actual)
         {
-            Assert.That(actual, Is.AssignableFrom(typeof(T)) ,null, null);
+            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>
@@ -1445,9 +1449,8 @@ namespace NUnit.Framework
         /// <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);
+            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>
@@ -1456,9 +1459,8 @@ namespace NUnit.Framework
         /// <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);
+            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>
@@ -1466,14 +1468,14 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.Not.AssignableFrom(expected), null, null);
         }
-        
+
         #endregion
-        
+
         #region IsNotAssignableFrom<T>
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Asserts that an object may not be assigned a  value of a given Type.
         /// </summary>
@@ -1483,9 +1485,8 @@ namespace NUnit.Framework
         /// <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);
+            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>
@@ -1494,9 +1495,8 @@ namespace NUnit.Framework
         /// <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);
+            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>
@@ -1504,14 +1504,14 @@ namespace NUnit.Framework
         /// <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);
+            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>
@@ -1521,9 +1521,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.InstanceOf(expected), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1532,9 +1531,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.InstanceOf(expected), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1542,9 +1540,9 @@ namespace NUnit.Framework
         /// <param name="actual">The object being examined</param>
         public static void IsInstanceOf(Type expected, object actual)
         {
-            Assert.That(actual, Is.InstanceOf(expected) ,null, null);
+            Assert.That(actual, Is.InstanceOf(expected), null, null);
         }
-        
+
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1555,9 +1553,8 @@ namespace NUnit.Framework
         [Obsolete]
         public static void IsInstanceOfType(Type expected, object actual, string message, params object[] args)
         {
-            Assert.That(actual, Is.InstanceOf(expected) ,message, args);
+            Assert.That(actual, Is.InstanceOf(expected), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1567,9 +1564,8 @@ namespace NUnit.Framework
         [Obsolete]
         public static void IsInstanceOfType(Type expected, object actual, string message)
         {
-            Assert.That(actual, Is.InstanceOf(expected) ,message, null);
+            Assert.That(actual, Is.InstanceOf(expected), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1578,14 +1574,14 @@ namespace NUnit.Framework
         [Obsolete]
         public static void IsInstanceOfType(Type expected, object actual)
         {
-            Assert.That(actual, Is.InstanceOf(expected) ,null, null);
+            Assert.That(actual, Is.InstanceOf(expected), null, null);
         }
-        
+
         #endregion
-        
+
         #region IsInstanceOf<T>
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1595,9 +1591,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.InstanceOf(typeof(T)), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1606,9 +1601,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.InstanceOf(typeof(T)), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is an instance of a given type.
         /// </summary>
@@ -1616,14 +1610,14 @@ namespace NUnit.Framework
         /// <param name="actual">The object being examined</param>
         public static void IsInstanceOf<T>(object actual)
         {
-            Assert.That(actual, Is.InstanceOf(typeof(T)) ,null, null);
+            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>
@@ -1633,9 +1627,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1644,9 +1637,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1654,9 +1646,9 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.Not.InstanceOf(expected), null, null);
         }
-        
+
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1667,9 +1659,8 @@ namespace NUnit.Framework
         [Obsolete]
         public static void IsNotInstanceOfType(Type expected, object actual, string message, params object[] args)
         {
-            Assert.That(actual, Is.Not.InstanceOf(expected) ,message, args);
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1679,9 +1670,8 @@ namespace NUnit.Framework
         [Obsolete]
         public static void IsNotInstanceOfType(Type expected, object actual, string message)
         {
-            Assert.That(actual, Is.Not.InstanceOf(expected) ,message, null);
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1690,14 +1680,14 @@ namespace NUnit.Framework
         [Obsolete]
         public static void IsNotInstanceOfType(Type expected, object actual)
         {
-            Assert.That(actual, Is.Not.InstanceOf(expected) ,null, null);
+            Assert.That(actual, Is.Not.InstanceOf(expected), null, null);
         }
-        
+
         #endregion
-        
+
         #region IsNotInstanceOf<T>
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1707,9 +1697,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1718,9 +1707,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is not an instance of a given type.
         /// </summary>
@@ -1728,14 +1716,14 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1746,9 +1734,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1758,9 +1745,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1769,9 +1755,9 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreEqual(int expected, int actual)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+            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.
@@ -1782,9 +1768,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1794,9 +1779,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1805,9 +1789,9 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreEqual(long expected, long actual)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+            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.
@@ -1819,9 +1803,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreEqual(uint expected, uint actual, string message, params object[] args)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,message, 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.
@@ -1832,9 +1815,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreEqual(uint expected, uint actual, string message)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+            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.
@@ -1844,9 +1826,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreEqual(uint expected, uint actual)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+            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.
@@ -1858,9 +1840,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreEqual(ulong expected, ulong actual, string message, params object[] args)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,message, 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.
@@ -1871,9 +1852,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreEqual(ulong expected, ulong actual, string message)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,message, null);
+            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.
@@ -1883,9 +1863,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreEqual(ulong expected, ulong actual)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+            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.
@@ -1896,9 +1876,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1908,9 +1887,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -1919,13 +1897,13 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreEqual(decimal expected, decimal actual)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+            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 
@@ -1940,9 +1918,8 @@ namespace NUnit.Framework
         /// <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);
+            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 
@@ -1956,9 +1933,8 @@ namespace NUnit.Framework
         /// <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);
+            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 
@@ -1971,10 +1947,10 @@ namespace NUnit.Framework
         /// the expected and the actual</param>
         public static void AreEqual(double expected, double actual, double delta)
         {
-            AssertDoublesAreEqual(expected, actual, delta ,null, null);
+            AssertDoublesAreEqual(expected, actual, delta, null, null);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Verifies that two doubles are equal considering a delta. If the
         /// expected value is infinity then the delta value is ignored. If 
@@ -1989,9 +1965,8 @@ namespace NUnit.Framework
         /// <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);
+            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 
@@ -2005,9 +1980,8 @@ namespace NUnit.Framework
         /// <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);
+            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 
@@ -2020,14 +1994,14 @@ namespace NUnit.Framework
         /// the expected and the actual</param>
         public static void AreEqual(double expected, double? actual, double delta)
         {
-            AssertDoublesAreEqual(expected, (double)actual, delta ,null, null);
+            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
@@ -2040,9 +2014,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2054,9 +2027,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2067,13 +2039,13 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreEqual(object expected, object actual)
         {
-            Assert.That(actual, Is.EqualTo(expected) ,null, null);
+            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.
@@ -2084,9 +2056,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2096,9 +2067,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2107,9 +2077,9 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreNotEqual(int expected, int actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2120,9 +2090,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2132,9 +2101,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2143,9 +2111,9 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreNotEqual(long expected, long actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2157,9 +2125,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreNotEqual(uint expected, uint actual, string message, params object[] args)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,message, 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.
@@ -2170,9 +2137,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreNotEqual(uint expected, uint actual, string message)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+            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.
@@ -2182,9 +2148,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreNotEqual(uint expected, uint actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2196,9 +2162,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreNotEqual(ulong expected, ulong actual, string message, params object[] args)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,message, 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.
@@ -2209,9 +2174,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreNotEqual(ulong expected, ulong actual, string message)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,message, null);
+            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.
@@ -2221,9 +2185,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void AreNotEqual(ulong expected, ulong actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2234,9 +2198,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2246,9 +2209,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2257,9 +2219,9 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreNotEqual(decimal expected, decimal actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2270,9 +2232,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2282,9 +2243,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2293,9 +2253,9 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreNotEqual(float expected, float actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2306,9 +2266,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2318,9 +2277,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2329,13 +2287,13 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreNotEqual(double expected, double actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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
@@ -2348,9 +2306,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2362,9 +2319,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2375,13 +2331,13 @@ namespace NUnit.Framework
         /// <param name="actual">The actual value</param>
         public static void AreNotEqual(object expected, object actual)
         {
-            Assert.That(actual, Is.Not.EqualTo(expected) ,null, null);
+            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.
@@ -2392,9 +2348,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2404,9 +2359,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2415,13 +2369,13 @@ namespace NUnit.Framework
         /// <param name="actual">The actual object</param>
         public static void AreSame(object expected, object actual)
         {
-            Assert.That(actual, Is.SameAs(expected) ,null, null);
+            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.
@@ -2432,9 +2386,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2444,9 +2397,8 @@ namespace NUnit.Framework
         /// <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);
+            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.
@@ -2455,13 +2407,13 @@ namespace NUnit.Framework
         /// <param name="actual">The actual object</param>
         public static void AreNotSame(object expected, object actual)
         {
-            Assert.That(actual, Is.Not.SameAs(expected) ,null, null);
+            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
@@ -2473,9 +2425,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2486,9 +2437,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2498,9 +2448,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2513,9 +2463,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Greater(uint arg1, uint arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.GreaterThan(arg2) ,message, 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
@@ -2527,9 +2476,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Greater(uint arg1, uint arg2, string message)
         {
-            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+            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
@@ -2540,9 +2488,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Greater(uint arg1, uint arg2)
         {
-            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+            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
@@ -2554,9 +2502,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2567,9 +2514,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2579,9 +2525,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2594,9 +2540,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Greater(ulong arg1, ulong arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.GreaterThan(arg2) ,message, 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
@@ -2608,9 +2553,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Greater(ulong arg1, ulong arg2, string message)
         {
-            Assert.That(arg1, Is.GreaterThan(arg2) ,message, null);
+            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
@@ -2621,9 +2565,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Greater(ulong arg1, ulong arg2)
         {
-            Assert.That(arg1, Is.GreaterThan(arg2) ,null, null);
+            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
@@ -2635,9 +2579,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2648,9 +2591,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2660,9 +2602,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2674,9 +2616,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2687,9 +2628,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2699,9 +2639,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2713,9 +2653,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2726,9 +2665,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2738,9 +2676,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2752,9 +2690,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2765,9 +2702,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2777,13 +2713,13 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2795,9 +2731,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2808,9 +2743,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2820,9 +2754,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2835,9 +2769,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Less(uint arg1, uint arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.LessThan(arg2) ,message, 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
@@ -2849,9 +2782,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Less(uint arg1, uint arg2, string message)
         {
-            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+            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
@@ -2862,9 +2794,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Less(uint arg1, uint arg2)
         {
-            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+            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
@@ -2876,9 +2808,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2889,9 +2820,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2901,9 +2831,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2916,9 +2846,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Less(ulong arg1, ulong arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.LessThan(arg2) ,message, 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
@@ -2930,9 +2859,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Less(ulong arg1, ulong arg2, string message)
         {
-            Assert.That(arg1, Is.LessThan(arg2) ,message, null);
+            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
@@ -2943,9 +2871,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void Less(ulong arg1, ulong arg2)
         {
-            Assert.That(arg1, Is.LessThan(arg2) ,null, null);
+            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
@@ -2957,9 +2885,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2970,9 +2897,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2982,9 +2908,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -2996,9 +2922,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3009,9 +2934,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3021,9 +2945,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3035,9 +2959,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3048,9 +2971,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3060,9 +2982,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3074,9 +2996,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3087,9 +3008,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3099,13 +3019,13 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3117,9 +3037,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3130,9 +3049,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3142,9 +3060,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3157,9 +3075,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void GreaterOrEqual(uint arg1, uint arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, 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
@@ -3171,9 +3088,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void GreaterOrEqual(uint arg1, uint arg2, string message)
         {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+            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
@@ -3184,9 +3100,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void GreaterOrEqual(uint arg1, uint arg2)
         {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+            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
@@ -3198,9 +3114,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3211,9 +3126,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3223,9 +3137,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3238,9 +3152,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void GreaterOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, 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
@@ -3252,9 +3165,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void GreaterOrEqual(ulong arg1, ulong arg2, string message)
         {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,message, null);
+            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
@@ -3265,9 +3177,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void GreaterOrEqual(ulong arg1, ulong arg2)
         {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2) ,null, null);
+            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
@@ -3279,9 +3191,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3292,9 +3203,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3304,9 +3214,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3318,9 +3228,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3331,9 +3240,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3343,9 +3251,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3357,9 +3265,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3370,9 +3277,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3382,9 +3288,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3396,9 +3302,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3409,9 +3314,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3421,13 +3325,13 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3439,9 +3343,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3452,9 +3355,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3464,9 +3366,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3479,9 +3381,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void LessOrEqual(uint arg1, uint arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, 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
@@ -3493,9 +3394,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void LessOrEqual(uint arg1, uint arg2, string message)
         {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+            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
@@ -3506,9 +3406,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void LessOrEqual(uint arg1, uint arg2)
         {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+            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
@@ -3520,9 +3420,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3533,9 +3432,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3545,9 +3443,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3560,9 +3458,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void LessOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
         {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, 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
@@ -3574,9 +3471,8 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void LessOrEqual(ulong arg1, ulong arg2, string message)
         {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,message, null);
+            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
@@ -3587,9 +3483,9 @@ namespace NUnit.Framework
         [CLSCompliant(false)]
         public static void LessOrEqual(ulong arg1, ulong arg2)
         {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2) ,null, null);
+            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
@@ -3601,9 +3497,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3614,9 +3509,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3626,9 +3520,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3640,9 +3534,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3653,9 +3546,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3665,9 +3557,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3679,9 +3571,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3692,9 +3583,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3704,9 +3594,9 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3718,9 +3608,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3731,9 +3620,8 @@ namespace NUnit.Framework
         /// <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);
+            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
@@ -3743,13 +3631,13 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
         }
-        
+
         #endregion
-        
+
         #region Contains
-        
+
         /// <summary>
         /// Asserts that an object is contained in a list.
         /// </summary>
@@ -3759,9 +3647,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, new CollectionContainsConstraint(expected), message, args);
         }
-        
         /// <summary>
         /// Asserts that an object is contained in a list.
         /// </summary>
@@ -3770,9 +3657,8 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, new CollectionContainsConstraint(expected), message, null);
         }
-        
         /// <summary>
         /// Asserts that an object is contained in a list.
         /// </summary>
@@ -3780,10 +3666,10 @@ namespace NUnit.Framework
         /// <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);
+            Assert.That(actual, new CollectionContainsConstraint(expected), null, null);
         }
-        
+
         #endregion
-        
+
     }
 }
diff --git a/src/NUnitFramework/framework/AssertionHelper.cs b/src/NUnitFramework/framework/AssertionHelper.cs
index 1001a31..dc78048 100644
--- a/src/NUnitFramework/framework/AssertionHelper.cs
+++ b/src/NUnitFramework/framework/AssertionHelper.cs
@@ -34,7 +34,7 @@ namespace NUnit.Framework
         /// <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)"/>
+        /// identically to Assert.That
         /// </summary>
         /// <param name="constraint">A Constraint to be applied</param>
         /// <param name="actual">The actual value to test</param>
@@ -46,7 +46,7 @@ namespace NUnit.Framework
         /// <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)"/>
+        /// identically to Assert.That.
         /// </summary>
         /// <param name="constraint">A Constraint to be applied</param>
         /// <param name="actual">The actual value to test</param>
@@ -59,7 +59,7 @@ namespace NUnit.Framework
         /// <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[])"/>
+        /// identically to Assert.That
         /// </summary>
         /// <param name="constraint">A Constraint to be applied</param>
         /// <param name="actual">The actual value to test</param>
@@ -110,7 +110,7 @@ namespace NUnit.Framework
         #endregion
 
         #region ref Object
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Apply a constraint to a referenced value, succeeding if the constraint
         /// is satisfied and throwing an assertion exception on failure.
@@ -174,8 +174,8 @@ namespace NUnit.Framework
         /// 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="expression">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(ref bool actual, IResolveConstraint expression, string message, params object[] args)
@@ -188,8 +188,7 @@ namespace NUnit.Framework
         #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[])"/>.
+		/// an <see cref="AssertionException"/>. Works Identically to Assert.That.
 		/// </summary> 
 		/// <param name="condition">The evaluated condition</param>
 		/// <param name="message">The message to display if the condition is false</param>
@@ -201,8 +200,7 @@ namespace NUnit.Framework
 
 		/// <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)"/>.
+		/// an <see cref="AssertionException"/>. Works Identically to Assert.That.
 		/// </summary>
 		/// <param name="condition">The evaluated condition</param>
 		/// <param name="message">The message to display if the condition is false</param>
@@ -213,7 +211,7 @@ namespace NUnit.Framework
 
 		/// <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)"/>.
+		/// an <see cref="AssertionException"/>. Works Identically Assert.That.
 		/// </summary>
 		/// <param name="condition">The evaluated condition</param>
 		public void Expect(bool condition)
diff --git a/src/NUnitFramework/framework/Assume.cs b/src/NUnitFramework/framework/Assume.cs
index 6309eca..cbcd02b 100644
--- a/src/NUnitFramework/framework/Assume.cs
+++ b/src/NUnitFramework/framework/Assume.cs
@@ -140,7 +140,7 @@ namespace NUnit.Framework
         #endregion
 
         #region ref Object
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Apply a constraint to a referenced value, succeeding if the constraint
         /// is satisfied and throwing an InconclusiveException on failure.
@@ -211,8 +211,8 @@ namespace NUnit.Framework
         /// 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="expression">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(ref bool actual, IResolveConstraint expression, string message, params object[] args)
diff --git a/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs b/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs
new file mode 100644
index 0000000..f791fdf
--- /dev/null
+++ b/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Provide actions to execute before and after tests.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
+    public abstract class TestActionAttribute : Attribute, ITestAction
+    {
+        public virtual void BeforeTest(TestDetails testDetails) { }
+        public virtual void AfterTest(TestDetails testDetails) { }
+        
+        public virtual ActionTargets Targets
+        {
+            get { return ActionTargets.Default; }
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs b/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
index 6ede3a8..cfdfeb3 100644
--- a/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
@@ -17,8 +17,11 @@ namespace NUnit.Framework
     [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited=false)]
     public class TestCaseAttribute : Attribute, ITestCaseData
     {
+        #region Instance Variables
+
         private object[] arguments;
-        private object result;
+        private object expectedResult;
+        private bool hasExpectedResult;
         private Type expectedExceptionType;
         private string expectedExceptionName;
         private string expectedMessage;
@@ -26,9 +29,14 @@ namespace NUnit.Framework
         private string description;
         private string testName;
         private bool isIgnored;
-        private string ignoreReason;
+        private bool isExplicit;
+        private string reason;
         private string category;
 
+        #endregion
+
+        #region Constructors
+
         /// <summary>
         /// Construct a TestCaseAttribute with a list of arguments.
         /// This constructor is not CLS-Compliant
@@ -72,6 +80,10 @@ namespace NUnit.Framework
             this.arguments = new object[] { arg1, arg2, arg3 };
         }
 
+        #endregion
+
+        #region Properties
+
         /// <summary>
         /// Gets the list of arguments to a test case
         /// </summary>
@@ -86,8 +98,30 @@ namespace NUnit.Framework
         /// <value>The result.</value>
         public object Result
         {
-            get { return result; }
-            set { result = value; }
+            get { return expectedResult; }
+            set
+            {
+                expectedResult = value;
+                hasExpectedResult = true;
+            }
+        }
+
+        /// <summary>
+        /// Gets the expected result.
+        /// </summary>
+        /// <value>The result.</value>
+        public object ExpectedResult
+        {
+            get { return expectedResult; }
+        }
+
+        /// <summary>
+        /// Gets a flag indicating whether an expected
+        /// result has been set.
+        /// </summary>
+        public bool HasExpectedResult
+        {
+            get { return hasExpectedResult; }
         }
 
         /// <summary>
@@ -194,17 +228,38 @@ namespace NUnit.Framework
         }
 
         /// <summary>
-        /// Gets the ignore reason.
+        /// Gets or sets the explicit status of the test
+        /// </summary>
+        public bool Explicit
+        {
+            get { return isExplicit; }
+            set { isExplicit = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the reason for not running the test
+        /// </summary>
+        public string Reason
+        {
+            get { return reason; }
+            set { reason = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the reason for not running the test.
+        /// Set has the side effect of marking the test as ignored.
         /// </summary>
         /// <value>The ignore reason.</value>
         public string IgnoreReason
         {
-            get { return ignoreReason; }
+            get { return reason; }
             set 
             { 
-                ignoreReason = value;
-                isIgnored = ignoreReason != null && ignoreReason != string.Empty;
+                reason = value;
+                isIgnored = reason != null && reason != string.Empty;
             }
         }
+
+        #endregion
     }
 }
diff --git a/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs b/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
index 880c363..33d14b9 100644
--- a/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
@@ -17,6 +17,7 @@ namespace NUnit.Framework
     {
         private readonly string sourceName;
         private readonly Type sourceType;
+        private string category;
 
         /// <summary>
         /// Construct with the name of the factory - for use with languages
@@ -55,5 +56,15 @@ namespace NUnit.Framework
         {
             get { return sourceType;  }
         }
+
+        /// <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; }
+        }
     }
 }
diff --git a/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs b/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
index 2acd0ea..2c9b5e5 100644
--- a/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
@@ -24,7 +24,7 @@ namespace NUnit.Framework
         private string ignoreReason;
         private string category;
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         private Type[] typeArgs;
         private bool argsSeparated;
 #endif
@@ -83,9 +83,9 @@ namespace NUnit.Framework
         /// </summary>
         public object[] Arguments
         {
-            get 
+            get
             {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 if (!argsSeparated)
                     SeparateArgs();
 #endif
@@ -117,7 +117,7 @@ namespace NUnit.Framework
             }
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Get or set the type arguments. If not set
         /// explicitly, any leading arguments that are
diff --git a/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs b/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
index f145b04..3643183 100644
--- a/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
+++ b/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
@@ -10,7 +10,7 @@ using System.Threading;
 namespace NUnit.Framework
 {
     /// <summary>
-    /// WUsed on a method, marks the test with a timeout value in milliseconds. 
+    /// Used 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.
diff --git a/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs b/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
index 1402f34..655a1f6 100644
--- a/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
@@ -8,7 +8,7 @@ using System;
 using System.Collections;
 using System.Reflection;
 using System.Text;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -44,9 +44,12 @@ namespace NUnit.Framework.Constraints
 			ICollection collection = enumerable as ICollection;
 			if ( collection != null )
 				return collection.Count == 0;
-			else
-				return !enumerable.GetEnumerator().MoveNext();
-		}
+
+            foreach (object o in enumerable)
+                return false;
+
+            return true;
+        }
 
 		/// <summary>
 		/// Test whether the constraint is satisfied by a given value
@@ -116,11 +119,11 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public CollectionItemsEqualConstraint Using(IComparer comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Flag the constraint to use the supplied IComparer object.
         /// </summary>
@@ -128,7 +131,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public CollectionItemsEqualConstraint Using<T>(IComparer<T> comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 
@@ -139,7 +142,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public CollectionItemsEqualConstraint Using<T>(Comparison<T> comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 
@@ -150,7 +153,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public CollectionItemsEqualConstraint Using(IEqualityComparer comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 
@@ -161,7 +164,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public CollectionItemsEqualConstraint Using<T>(IEqualityComparer<T> comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 #endif
@@ -172,7 +175,8 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         protected bool ItemsEqual(object x, object y)
         {
-            return comparer.ObjectsEqual(x, y);
+            Tolerance tolerance = Tolerance.Zero;
+            return comparer.AreEqual(x, y, ref tolerance);
         }
 
         /// <summary>
@@ -428,7 +432,7 @@ namespace NUnit.Framework.Constraints
             return this;
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Modifies the constraint to use an IComparer<T> and returns self.
         /// </summary>
diff --git a/src/NUnitFramework/framework/Constraints/CollectionTally.cs b/src/NUnitFramework/framework/Constraints/CollectionTally.cs
index 09247bc..0e4f76a 100644
--- a/src/NUnitFramework/framework/Constraints/CollectionTally.cs
+++ b/src/NUnitFramework/framework/Constraints/CollectionTally.cs
@@ -41,7 +41,8 @@ namespace NUnit.Framework.Constraints
 
         private bool ItemsEqual(object expected, object actual)
         {
-            return comparer.ObjectsEqual(expected, actual);
+            Tolerance tolerance = Tolerance.Zero;
+            return comparer.AreEqual(expected, actual, ref tolerance);
         }
 
         /// <summary>
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs b/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
index e6fa1c2..11e2441 100644
--- a/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
+++ b/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
@@ -7,7 +7,7 @@
 using System;
 using System.Collections;
 using System.Reflection;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -37,7 +37,7 @@ namespace NUnit.Framework.Constraints
             return new ComparerAdapter(comparer);
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a ComparisonAdapter that wraps an IComparer<T>
         /// </summary>
@@ -92,7 +92,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// ComparisonAdapter<T> extends ComparisonAdapter and
         /// allows use of an IComparer<T> or Comparison<T>
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs b/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
index c50445f..8f349c7 100644
--- a/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
@@ -1,12 +1,12 @@
 // ****************************************************************
-// Copyright 2007, Charlie Poole
+// 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;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -15,83 +15,24 @@ namespace NUnit.Framework.Constraints
     /// <summary>
     /// Abstract base class for constraints that compare values to
     /// determine if one is greater than, equal to or less than
-    /// the other.
+    /// the other. This class supplies the Using modifiers.
     /// </summary>
     public abstract class ComparisonConstraint : Constraint
     {
         /// <summary>
-        /// The value against which a comparison is to be made
-        /// </summary>
-        protected object expected;
-        /// <summary>
-        /// If true, less than returns success
-        /// </summary>
-        protected bool ltOK = false;
-        /// <summary>
-        /// if true, equal returns success
-        /// </summary>
-        protected bool eqOK = false;
-        /// <summary>
-        /// if true, greater than returns success
-        /// </summary>
-        protected bool gtOK = false;
-        /// <summary>
-        /// The predicate used as a part of the description
-        /// </summary>
-        private string predicate;
-
-        /// <summary>
         /// ComparisonAdapter to be used in making the comparison
         /// </summary>
-        private ComparisonAdapter comparer = ComparisonAdapter.Default;
+        protected 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>
-        /// <param name="ltOK">if set to <c>true</c> less succeeds.</param>
-        /// <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(object value, bool ltOK, bool eqOK, bool gtOK, string predicate)
-            : base(value)
-        {
-            this.expected = value;
-            this.ltOK = ltOK;
-            this.eqOK = eqOK;
-            this.gtOK = gtOK;
-            this.predicate = predicate;
-        }
+        public ComparisonConstraint(object arg) : base(arg) { }
 
         /// <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 (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;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
+        /// Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
         /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate(predicate);
-            writer.WriteExpectedValue(expected);
-        }
+        public ComparisonConstraint(object arg1, object arg2) : base(arg1, arg2) { }
 
         /// <summary>
         /// Modifies the constraint to use an IComparer and returns self
@@ -102,7 +43,7 @@ namespace NUnit.Framework.Constraints
             return this;
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Modifies the constraint to use an IComparer<T> and returns self
         /// </summary>
@@ -122,52 +63,4 @@ namespace NUnit.Framework.Constraints
         }
 #endif
     }
-
-    /// <summary>
-    /// Tests whether a value is greater than the value supplied to its constructor
-    /// </summary>
-    public class GreaterThanConstraint : ComparisonConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:GreaterThanConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected value.</param>
-        public GreaterThanConstraint(object expected) : base(expected, false, false, true, "greater than") { }
-    }
-
-    /// <summary>
-    /// Tests whether a value is greater than or equal to the value supplied to its constructor
-    /// </summary>
-    public class GreaterThanOrEqualConstraint : ComparisonConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:GreaterThanOrEqualConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected value.</param>
-        public GreaterThanOrEqualConstraint(object expected) : base(expected, false, true, true, "greater than or equal to") { }
-    }
-
-    /// <summary>
-    /// Tests whether a value is less than the value supplied to its constructor
-    /// </summary>
-    public class LessThanConstraint : ComparisonConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:LessThanConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected value.</param>
-        public LessThanConstraint(object expected) : base(expected, true, false, false, "less than") { }
-    }
-
-    /// <summary>
-    /// Tests whether a value is less than or equal to the value supplied to its constructor
-    /// </summary>
-    public class LessThanOrEqualConstraint : ComparisonConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:LessThanOrEqualConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected value.</param>
-        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 8c77f5f..738b47e 100644
--- a/src/NUnitFramework/framework/Constraints/Constraint.cs
+++ b/src/NUnitFramework/framework/Constraints/Constraint.cs
@@ -169,7 +169,7 @@ namespace NUnit.Framework.Constraints
             return Matches(del());
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Test whether the constraint is satisfied by a given reference.
         /// The default implementation simply dereferences the value but
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs b/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
index 50c0189..2ba49d8 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -28,7 +28,7 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         public class OperatorStack
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             private Stack<ConstraintOperator> stack = new Stack<ConstraintOperator>();
 #else
 		    private Stack stack = new Stack();
@@ -85,7 +85,7 @@ namespace NUnit.Framework.Constraints
         /// </summary>
         public class ConstraintStack
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             private Stack<Constraint> stack = new Stack<Constraint>();
 #else
 		    private Stack stack = new Stack();
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
index b04f63a..82611af 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
@@ -4,14 +4,6 @@
 // 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;
 
@@ -41,7 +33,7 @@ namespace NUnit.Framework.Constraints
             : base( builder ) { }
 
         #region Not
-        
+
         /// <summary>
         /// Returns a ConstraintExpression that negates any
         /// following constraint.
@@ -50,7 +42,7 @@ namespace NUnit.Framework.Constraints
         {
             get { return this.Append(new NotOperator()); }
         }
-        
+
         /// <summary>
         /// Returns a ConstraintExpression that negates any
         /// following constraint.
@@ -59,11 +51,11 @@ namespace NUnit.Framework.Constraints
         {
             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,
@@ -73,11 +65,11 @@ namespace NUnit.Framework.Constraints
         {
             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,
@@ -87,11 +79,11 @@ namespace NUnit.Framework.Constraints
         {
             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,
@@ -101,11 +93,25 @@ namespace NUnit.Framework.Constraints
         {
             get { return this.Append(new NoneOperator()); }
         }
-        
+
         #endregion
-        
+
+        #region Exactly(n)
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding only if a specified number of them succeed.
+        /// </summary>
+        public ConstraintExpression Exactly(int expectedCount)
+        {
+            return this.Append(new ExactCountOperator(expectedCount));
+        }
+
+        #endregion
+
         #region Property
-        
+
         /// <summary>
         /// Returns a new PropertyConstraintExpression, which will either
         /// test for the existence of the named property on the object
@@ -115,11 +121,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -128,11 +134,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -141,11 +147,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -154,11 +160,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -167,11 +173,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return Property("InnerException"); }
         }
-        
+
         #endregion
-        
+
         #region Attribute
-        
+
         /// <summary>
         /// Returns a new AttributeConstraint checking for the
         /// presence of a particular attribute on an object.
@@ -180,8 +186,8 @@ namespace NUnit.Framework.Constraints
         {
             return this.Append(new AttributeOperator(expectedType));
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a new AttributeConstraint checking for the
         /// presence of a particular attribute on an object.
@@ -190,12 +196,12 @@ namespace NUnit.Framework.Constraints
         {
             return Attribute(typeof(T));
         }
-        
 #endif
+
         #endregion
-        
+
         #region With
-        
+
         /// <summary>
         /// With is currently a NOP - reserved for future use.
         /// </summary>
@@ -203,11 +209,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -216,8 +222,8 @@ namespace NUnit.Framework.Constraints
         {
             return this.Append(constraint);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns the constraint provided as an argument - used to allow custom
         /// custom constraints to easily participate in the syntax.
@@ -226,12 +232,12 @@ namespace NUnit.Framework.Constraints
         {
             return this.Append(new PredicateConstraint<T>(predicate));
         }
-        
 #endif
+
         #endregion
-        
+
         #region Null
-        
+
         /// <summary>
         /// Returns a constraint that tests for null
         /// </summary>
@@ -239,11 +245,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return (NullConstraint)this.Append(new NullConstraint()); }
         }
-        
+
         #endregion
-        
+
         #region True
-        
+
         /// <summary>
         /// Returns a constraint that tests for True
         /// </summary>
@@ -251,11 +257,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return (TrueConstraint)this.Append(new TrueConstraint()); }
         }
-        
+
         #endregion
-        
+
         #region False
-        
+
         /// <summary>
         /// Returns a constraint that tests for False
         /// </summary>
@@ -263,11 +269,35 @@ namespace NUnit.Framework.Constraints
         {
             get { return (FalseConstraint)this.Append(new FalseConstraint()); }
         }
-        
+
+        #endregion
+
+        #region Positive
+
+        /// <summary>
+        /// Returns a constraint that tests for a positive value
+        /// </summary>
+        public GreaterThanConstraint Positive
+        {
+            get { return (GreaterThanConstraint)this.Append(new GreaterThanConstraint(0)); }
+        }
+
+        #endregion
+
+        #region Negative
+
+        /// <summary>
+        /// Returns a constraint that tests for a negative value
+        /// </summary>
+        public LessThanConstraint Negative
+        {
+            get { return (LessThanConstraint)this.Append(new LessThanConstraint(0)); }
+        }
+
         #endregion
-        
+
         #region NaN
-        
+
         /// <summary>
         /// Returns a constraint that tests for NaN
         /// </summary>
@@ -275,11 +305,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return (NaNConstraint)this.Append(new NaNConstraint()); }
         }
-        
+
         #endregion
-        
+
         #region Empty
-        
+
         /// <summary>
         /// Returns a constraint that tests for empty
         /// </summary>
@@ -287,11 +317,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return (EmptyConstraint)this.Append(new EmptyConstraint()); }
         }
-        
+
         #endregion
-        
+
         #region Unique
-        
+
         /// <summary>
         /// Returns a constraint that tests whether a collection 
         /// contains all unique items.
@@ -300,11 +330,11 @@ namespace NUnit.Framework.Constraints
         {
             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>
@@ -312,11 +342,11 @@ namespace NUnit.Framework.Constraints
         {
             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>
@@ -324,11 +354,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return (XmlSerializableConstraint)this.Append(new XmlSerializableConstraint()); }
         }
-        
+
         #endregion
-        
+
         #region EqualTo
-        
+
         /// <summary>
         /// Returns a constraint that tests two items for equality
         /// </summary>
@@ -336,11 +366,11 @@ namespace NUnit.Framework.Constraints
         {
             return (EqualConstraint)this.Append(new EqualConstraint(expected));
         }
-        
+
         #endregion
-        
+
         #region SameAs
-        
+
         /// <summary>
         /// Returns a constraint that tests that two references are the same object
         /// </summary>
@@ -348,11 +378,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -361,11 +391,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -374,7 +404,7 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -383,11 +413,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -396,11 +426,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -409,7 +439,7 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -418,11 +448,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -431,8 +461,8 @@ namespace NUnit.Framework.Constraints
         {
             return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(expectedType));
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual
         /// value is of the exact type supplied as an argument.
@@ -441,12 +471,12 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -455,8 +485,8 @@ namespace NUnit.Framework.Constraints
         {
             return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is of the type supplied as an argument or a derived type.
@@ -465,8 +495,8 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -476,8 +506,8 @@ namespace NUnit.Framework.Constraints
         {
             return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is of the type supplied as an argument or a derived type.
@@ -487,12 +517,12 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -501,8 +531,8 @@ namespace NUnit.Framework.Constraints
         {
             return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(expectedType));
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is assignable from the type supplied as an argument.
@@ -511,12 +541,12 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -525,8 +555,8 @@ namespace NUnit.Framework.Constraints
         {
             return (AssignableToConstraint)this.Append(new AssignableToConstraint(expectedType));
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is assignable from the type supplied as an argument.
@@ -535,12 +565,12 @@ namespace NUnit.Framework.Constraints
         {
             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 
@@ -550,11 +580,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -563,11 +593,11 @@ namespace NUnit.Framework.Constraints
         {
             return (CollectionSubsetConstraint)this.Append(new CollectionSubsetConstraint(expected));
         }
-        
+
         #endregion
-        
+
         #region Ordered
-        
+
         /// <summary>
         /// Returns a constraint that tests whether a collection is ordered
         /// </summary>
@@ -575,11 +605,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -588,7 +618,7 @@ namespace NUnit.Framework.Constraints
         {
             return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
         }
-        
+
         /// <summary>
         /// Returns a new CollectionContainsConstraint checking for the
         /// presence of a particular object in the collection.
@@ -597,11 +627,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -614,11 +644,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -627,7 +657,7 @@ namespace NUnit.Framework.Constraints
         {
             return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
         }
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value contains the substring supplied as an argument.
@@ -636,11 +666,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -649,7 +679,7 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -658,11 +688,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -671,7 +701,7 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -680,11 +710,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -693,7 +723,7 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -702,11 +732,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -715,11 +745,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -728,11 +758,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -741,11 +771,12 @@ namespace NUnit.Framework.Constraints
         {
             return (SamePathOrUnderConstraint)this.Append(new SamePathOrUnderConstraint(expected));
         }
-        
+
         #endregion
-        
+
         #region InRange
-        
+
+#if !CLR_2_0 && !CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value falls 
         /// within a specified range.
@@ -754,8 +785,24 @@ namespace NUnit.Framework.Constraints
         {
             return (RangeConstraint)this.Append(new RangeConstraint(from, to));
         }
-        
+#endif
+
         #endregion
-        
+
+        #region InRange<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public RangeConstraint<T> InRange<T>(T from, T to) where T : IComparable<T>
+        {
+            return (RangeConstraint<T>)this.Append(new RangeConstraint<T>(from, to));
+        }
+#endif
+
+        #endregion
+
     }
 }
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
index ba00b75..10f3af0 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
@@ -11,17 +11,14 @@ namespace NUnit.Framework.Constraints
 {
     /// <summary>
     /// ConstraintExpressionBase is the abstract base class for the 
-    /// generated ConstraintExpression class, which represents a 
+    /// 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.
+    /// NOTE: ConstraintExpressionBase is separate because the
+    /// ConstraintExpression class was generated in earlier
+    /// versions of NUnit. The two classes may be combined
+    /// in a future version.
     /// </summary>
     public abstract class ConstraintExpressionBase
     {
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs b/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
index ece41e0..5182ee4 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
@@ -4,14 +4,6 @@
 // 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;
 
@@ -24,7 +16,7 @@ namespace NUnit.Framework.Constraints
     public class ConstraintFactory
     {
         #region Not
-        
+
         /// <summary>
         /// Returns a ConstraintExpression that negates any
         /// following constraint.
@@ -33,7 +25,7 @@ namespace NUnit.Framework.Constraints
         {
             get { return Is.Not; }
         }
-        
+
         /// <summary>
         /// Returns a ConstraintExpression that negates any
         /// following constraint.
@@ -42,11 +34,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return Has.No; }
         }
-        
+
         #endregion
-        
+
         #region All
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -56,11 +48,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return Is.All; }
         }
-        
+
         #endregion
-        
+
         #region Some
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -70,11 +62,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return Has.Some; }
         }
-        
+
         #endregion
-        
+
         #region None
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -84,11 +76,25 @@ namespace NUnit.Framework.Constraints
         {
             get { return Has.None; }
         }
-        
+
+        #endregion
+
+        #region Exactly(n)
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding only if a specified number of them succeed.
+        /// </summary>
+        public static ConstraintExpression Exactly(int expectedCount)
+        {
+            return Has.Exactly(expectedCount);
+        }
+
         #endregion
-        
+
         #region Property
-        
+
         /// <summary>
         /// Returns a new PropertyConstraintExpression, which will either
         /// test for the existence of the named property on the object
@@ -98,11 +104,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -111,11 +117,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -124,11 +130,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -137,11 +143,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -150,11 +156,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return Has.InnerException; }
         }
-        
+
         #endregion
-        
+
         #region Attribute
-        
+
         /// <summary>
         /// Returns a new AttributeConstraint checking for the
         /// presence of a particular attribute on an object.
@@ -163,8 +169,8 @@ namespace NUnit.Framework.Constraints
         {
             return Has.Attribute(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a new AttributeConstraint checking for the
         /// presence of a particular attribute on an object.
@@ -173,12 +179,12 @@ namespace NUnit.Framework.Constraints
         {
             return Attribute(typeof(T));
         }
-        
 #endif
+
         #endregion
-        
+
         #region Null
-        
+
         /// <summary>
         /// Returns a constraint that tests for null
         /// </summary>
@@ -186,11 +192,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new NullConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region True
-        
+
         /// <summary>
         /// Returns a constraint that tests for True
         /// </summary>
@@ -198,11 +204,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new TrueConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region False
-        
+
         /// <summary>
         /// Returns a constraint that tests for False
         /// </summary>
@@ -210,11 +216,35 @@ namespace NUnit.Framework.Constraints
         {
             get { return new FalseConstraint(); }
         }
-        
+
+        #endregion
+
+        #region Positive
+
+        /// <summary>
+        /// Returns a constraint that tests for a positive value
+        /// </summary>
+        public GreaterThanConstraint Positive
+        {
+            get { return new GreaterThanConstraint(0); }
+        }
+
+        #endregion
+
+        #region Negative
+
+        /// <summary>
+        /// Returns a constraint that tests for a negative value
+        /// </summary>
+        public LessThanConstraint Negative
+        {
+            get { return new LessThanConstraint(0); }
+        }
+
         #endregion
-        
+
         #region NaN
-        
+
         /// <summary>
         /// Returns a constraint that tests for NaN
         /// </summary>
@@ -222,11 +252,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new NaNConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region Empty
-        
+
         /// <summary>
         /// Returns a constraint that tests for empty
         /// </summary>
@@ -234,11 +264,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new EmptyConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region Unique
-        
+
         /// <summary>
         /// Returns a constraint that tests whether a collection 
         /// contains all unique items.
@@ -247,11 +277,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new UniqueItemsConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region BinarySerializable
-        
+
         /// <summary>
         /// Returns a constraint that tests whether an object graph is serializable in binary format.
         /// </summary>
@@ -259,11 +289,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new BinarySerializableConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region XmlSerializable
-        
+
         /// <summary>
         /// Returns a constraint that tests whether an object graph is serializable in xml format.
         /// </summary>
@@ -271,11 +301,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new XmlSerializableConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region EqualTo
-        
+
         /// <summary>
         /// Returns a constraint that tests two items for equality
         /// </summary>
@@ -283,11 +313,11 @@ namespace NUnit.Framework.Constraints
         {
             return new EqualConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region SameAs
-        
+
         /// <summary>
         /// Returns a constraint that tests that two references are the same object
         /// </summary>
@@ -295,11 +325,11 @@ namespace NUnit.Framework.Constraints
         {
             return new SameAsConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region GreaterThan
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is greater than the suppled argument
@@ -308,11 +338,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -321,7 +351,7 @@ namespace NUnit.Framework.Constraints
         {
             return new GreaterThanOrEqualConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is greater than or equal to the suppled argument
@@ -330,11 +360,11 @@ namespace NUnit.Framework.Constraints
         {
             return new GreaterThanOrEqualConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region LessThan
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is less than the suppled argument
@@ -343,11 +373,11 @@ namespace NUnit.Framework.Constraints
         {
             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
@@ -356,7 +386,7 @@ namespace NUnit.Framework.Constraints
         {
             return new LessThanOrEqualConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is less than or equal to the suppled argument
@@ -365,11 +395,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -378,8 +408,8 @@ namespace NUnit.Framework.Constraints
         {
             return new ExactTypeConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual
         /// value is of the exact type supplied as an argument.
@@ -388,12 +418,12 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -402,8 +432,8 @@ namespace NUnit.Framework.Constraints
         {
             return new InstanceOfTypeConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is of the type supplied as an argument or a derived type.
@@ -412,8 +442,8 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -423,8 +453,8 @@ namespace NUnit.Framework.Constraints
         {
             return new InstanceOfTypeConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is of the type supplied as an argument or a derived type.
@@ -434,12 +464,12 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -448,8 +478,8 @@ namespace NUnit.Framework.Constraints
         {
             return new AssignableFromConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is assignable from the type supplied as an argument.
@@ -458,12 +488,12 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -472,8 +502,8 @@ namespace NUnit.Framework.Constraints
         {
             return new AssignableToConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is assignable from the type supplied as an argument.
@@ -482,12 +512,12 @@ namespace NUnit.Framework.Constraints
         {
             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 
@@ -497,11 +527,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -510,11 +540,11 @@ namespace NUnit.Framework.Constraints
         {
             return new CollectionSubsetConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region Ordered
-        
+
         /// <summary>
         /// Returns a constraint that tests whether a collection is ordered
         /// </summary>
@@ -522,11 +552,11 @@ namespace NUnit.Framework.Constraints
         {
             get { return new CollectionOrderedConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region Member
-        
+
         /// <summary>
         /// Returns a new CollectionContainsConstraint checking for the
         /// presence of a particular object in the collection.
@@ -535,7 +565,7 @@ namespace NUnit.Framework.Constraints
         {
             return new CollectionContainsConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a new CollectionContainsConstraint checking for the
         /// presence of a particular object in the collection.
@@ -544,11 +574,11 @@ namespace NUnit.Framework.Constraints
         {
             return new CollectionContainsConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region Contains
-        
+
         /// <summary>
         /// Returns a new ContainsConstraint. This constraint
         /// will, in turn, make use of the appropriate second-level
@@ -561,11 +591,11 @@ namespace NUnit.Framework.Constraints
         {
             return new ContainsConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region StringContaining
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value contains the substring supplied as an argument.
@@ -574,7 +604,7 @@ namespace NUnit.Framework.Constraints
         {
             return new SubstringConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value contains the substring supplied as an argument.
@@ -583,11 +613,11 @@ namespace NUnit.Framework.Constraints
         {
             return new SubstringConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region DoesNotContain
-        
+
         /// <summary>
         /// Returns a constraint that fails if the actual
         /// value contains the substring supplied as an argument.
@@ -596,11 +626,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -609,7 +639,7 @@ namespace NUnit.Framework.Constraints
         {
             return new StartsWithConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value starts with the substring supplied as an argument.
@@ -618,11 +648,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -631,11 +661,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -644,7 +674,7 @@ namespace NUnit.Framework.Constraints
         {
             return new EndsWithConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value ends with the substring supplied as an argument.
@@ -653,11 +683,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -666,11 +696,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -679,7 +709,7 @@ namespace NUnit.Framework.Constraints
         {
             return new RegexConstraint(pattern);
         }
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value matches the Regex pattern supplied as an argument.
@@ -688,11 +718,11 @@ namespace NUnit.Framework.Constraints
         {
             return new RegexConstraint(pattern);
         }
-        
+
         #endregion
-        
+
         #region DoesNotMatch
-        
+
         /// <summary>
         /// Returns a constraint that fails if the actual
         /// value matches the pattern supplied as an argument.
@@ -701,11 +731,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -714,11 +744,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -727,11 +757,11 @@ namespace NUnit.Framework.Constraints
         {
             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.
@@ -740,11 +770,12 @@ namespace NUnit.Framework.Constraints
         {
             return new SamePathOrUnderConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region InRange
-        
+
+#if !CLR_2_0 && !CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value falls 
         /// within a specified range.
@@ -753,8 +784,24 @@ namespace NUnit.Framework.Constraints
         {
             return new RangeConstraint(from, to);
         }
-        
+#endif
+
         #endregion
-        
+
+        #region InRange<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public RangeConstraint<T> InRange<T>(T from, T to) where T : IComparable<T>
+        {
+            return new RangeConstraint<T>(from, to);
+        }
+#endif
+
+        #endregion
+
     }
 }
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs b/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
index fbf2d3a..86f2695 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -210,6 +210,34 @@ namespace NUnit.Framework.Constraints
             return new NoItemConstraint(constraint);
         }
     }
+
+    /// <summary>
+    /// Represents a constraint that succeeds if the specified 
+    /// count of members of a collection match a base constraint.
+    /// </summary>
+    public class ExactCountOperator : CollectionOperator
+    {
+        private int expectedCount;
+
+        /// <summary>
+        /// Construct an ExactCountOperator for a specified count
+        /// </summary>
+        /// <param name="expectedCount">The expected count</param>
+        public ExactCountOperator(int expectedCount)
+        {
+            this.expectedCount = expectedCount;
+        }
+
+        /// <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 ExactCountConstraint(expectedCount, constraint);
+        }
+    }
     #endregion
 
     #region WithOperator
diff --git a/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs b/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
index 09724eb..5f2fec3 100644
--- a/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -46,7 +46,7 @@ namespace NUnit.Framework.Constraints
                         CollectionContainsConstraint constraint = new CollectionContainsConstraint(expected);
 						
 						if (this.adapter != null)
-							constraint.comparer.ExternalComparer = adapter;
+							constraint.comparer.ExternalComparers.Add(adapter);
 							
 						this.realConstraint = constraint;
 					}
@@ -109,7 +109,7 @@ namespace NUnit.Framework.Constraints
             return this;
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Flag the constraint to use the supplied IComparer object.
         /// </summary>
diff --git a/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs b/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
index 00b85ac..40ee24e 100644
--- a/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
@@ -49,7 +49,19 @@ namespace NUnit.Framework.Constraints
         /// <returns>True for if the base constraint fails, false if it succeeds</returns>
         public override bool Matches(object actual)
         {
-            Thread.Sleep(delayInMilliseconds);
+            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);
         }
@@ -68,8 +80,15 @@ namespace NUnit.Framework.Constraints
 				remainingDelay -= pollingInterval;
 				Thread.Sleep(pollingInterval);
 				this.actual = del();
-				if (baseConstraint.Matches(actual))
-					return true;
+                try
+                {
+                    if (baseConstraint.Matches(actual))
+                        return true;
+                }
+                catch (Exception)
+                {
+                    // Ignore any exceptions when polling
+                }
 			}
 
 			if ( remainingDelay > 0 )
@@ -78,7 +97,7 @@ namespace NUnit.Framework.Constraints
 			return baseConstraint.Matches(actual);
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Test whether the constraint is satisfied by a given reference.
         /// Overridden to wait for the specified delay period before
@@ -95,8 +114,15 @@ namespace NUnit.Framework.Constraints
                 remainingDelay -= pollingInterval;
                 Thread.Sleep(pollingInterval);
                 this.actual = actual;
-                if (baseConstraint.Matches(actual))
-                    return true;
+                try
+                {
+                    if (baseConstraint.Matches(actual))
+                        return true;
+                }
+                catch (Exception)
+                {
+                    // Ignore any exceptions when polling
+                }
             }
 
             if ( remainingDelay > 0 )
diff --git a/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs b/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
index 2d1c072..9a35fcb 100644
--- a/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
@@ -38,6 +38,9 @@ namespace NUnit.Framework.Constraints
 		{
 			this.actual = actual;
 
+            if (actual == null)
+                throw new ArgumentException("The actual value must be a non-null string, IEnumerable or DirectoryInfo", "actual");
+
 			return this.RealConstraint.Matches( actual );
 		}
 
diff --git a/src/NUnitFramework/framework/Constraints/EqualConstraint.cs b/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
index 935f619..61b4cc6 100644
--- a/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
@@ -7,7 +7,7 @@
 using System;
 using System.IO;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -25,6 +25,8 @@ namespace NUnit.Framework.Constraints
 
 		private readonly object expected;
 
+        private Tolerance tolerance = Tolerance.Empty;
+
         /// <summary>
         /// If true, strings in error messages will be clipped
         /// </summary>
@@ -114,10 +116,10 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public EqualConstraint Within(object amount)
         {
-            if (!comparer.Tolerance.IsEmpty)
+            if (!tolerance.IsEmpty)
                 throw new InvalidOperationException("Within modifier may appear only once in a constraint expression");
 
-            comparer.Tolerance = new Tolerance(amount);
+            tolerance = new Tolerance(amount);
             return this;
         }
 
@@ -139,7 +141,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Ulps;
+                tolerance = tolerance.Ulps;
                 return this;
             }
         }
@@ -154,7 +156,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Percent;
+                tolerance = tolerance.Percent;
                 return this;
             }
         }
@@ -167,7 +169,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Days;
+                tolerance = tolerance.Days;
                 return this;
             }
         }
@@ -180,7 +182,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Hours;
+                tolerance = tolerance.Hours;
                 return this;
             }
         }
@@ -193,7 +195,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Minutes;
+                tolerance = tolerance.Minutes;
                 return this;
             }
         }
@@ -206,7 +208,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Seconds;
+                tolerance = tolerance.Seconds;
                 return this;
             }
         }
@@ -219,7 +221,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Milliseconds;
+                tolerance = tolerance.Milliseconds;
                 return this;
             }
         }
@@ -232,7 +234,7 @@ namespace NUnit.Framework.Constraints
         {
             get
             {
-                comparer.Tolerance = comparer.Tolerance.Ticks;
+                tolerance = tolerance.Ticks;
                 return this;
             }
         }
@@ -255,11 +257,11 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public EqualConstraint Using(IComparer comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Flag the constraint to use the supplied IComparer object.
         /// </summary>
@@ -267,7 +269,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public EqualConstraint Using<T>(IComparer<T> comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For( comparer );
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For( comparer ));
             return this;
         }
 
@@ -278,7 +280,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public EqualConstraint Using<T>(Comparison<T> comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For( comparer );
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For( comparer ));
             return this;
         }
 
@@ -289,7 +291,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public EqualConstraint Using(IEqualityComparer comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 
@@ -300,7 +302,7 @@ namespace NUnit.Framework.Constraints
         /// <returns>Self.</returns>
         public EqualConstraint Using<T>(IEqualityComparer<T> comparer)
         {
-            this.comparer.ExternalComparer = EqualityAdapter.For(comparer);
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
             return this;
         }
 #endif
@@ -316,7 +318,7 @@ namespace NUnit.Framework.Constraints
         {
             this.actual = actual;
 
-            return comparer.ObjectsEqual(expected, actual);
+            return comparer.AreEqual(expected, actual, ref tolerance);
         }
 
         /// <summary>
@@ -338,10 +340,12 @@ namespace NUnit.Framework.Constraints
         {
 			writer.WriteExpectedValue( expected );
 
-            if (comparer.Tolerance != null && !comparer.Tolerance.IsEmpty)
+            if (tolerance != null && !tolerance.IsEmpty)
 			{
 				writer.WriteConnector("+/-");
-                writer.WriteExpectedValue(comparer.Tolerance.Value);
+                writer.WriteExpectedValue(tolerance.Value);
+                if (tolerance.Mode != ToleranceMode.Linear)
+                    writer.Write(" {0}", tolerance.Mode);
 			}
 
 			if ( comparer.IgnoreCase )
@@ -354,10 +358,12 @@ namespace NUnit.Framework.Constraints
                 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)
+            else if (expected is IEnumerable && actual is IEnumerable)
+                DisplayEnumerableDifferences(writer, (IEnumerable)expected, (IEnumerable)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 if (tolerance != null)
+                writer.DisplayDifferences(expected, actual, tolerance);
             else
                 writer.DisplayDifferences(expected, actual);
         }
@@ -394,56 +400,57 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Display the failure information for two collections that did not match.
         /// </summary>
-		/// <param name="writer">The MessageWriter on which to display</param>
-		/// <param name="expected">The expected collection.</param>
+        /// <param name="writer">The MessageWriter on which to display</param>
+        /// <param name="expected">The expected collection.</param>
         /// <param name="actual">The actual collection</param>
         /// <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 = comparer.FailurePoints.Count > depth ? (int)comparer.FailurePoints[depth] : -1;
-
-            DisplayCollectionTypesAndSizes(writer, expected, actual, depth);
+            DisplayTypesAndSizes(writer, expected, actual, depth);
 
-            if (failurePoint >= 0)
+            if (comparer.FailurePoints.Count > depth)
             {
+                NUnitEqualityComparer.FailurePoint failurePoint = (NUnitEqualityComparer.FailurePoint)comparer.FailurePoints[depth];
+
                 DisplayFailurePoint(writer, expected, actual, failurePoint, depth);
-				if (failurePoint < expected.Count && failurePoint < actual.Count)
-					DisplayDifferences(
-						writer,
-						GetValueFromCollection(expected, failurePoint),
-						GetValueFromCollection(actual, failurePoint),
-						++depth);
-				else if (expected.Count < actual.Count)
-				{
-					writer.Write( "  Extra:    " );
-					writer.WriteCollectionElements( actual, failurePoint, 3 );
-				}
-				else
-				{
-					writer.Write( "  Missing:  " );
-					writer.WriteCollectionElements( expected, failurePoint, 3 );
-				}
+
+                if (failurePoint.ExpectedHasData && failurePoint.ActualHasData)
+                    DisplayDifferences(
+                        writer,
+                        failurePoint.ExpectedValue,
+                        failurePoint.ActualValue,
+                        ++depth);
+                else if (failurePoint.ActualHasData)
+                {
+                    writer.Write("  Extra:    ");
+                    writer.WriteCollectionElements(actual, failurePoint.Position, 3);
+                }
+                else
+                {
+                    writer.Write("  Missing:  ");
+                    writer.WriteCollectionElements(expected, failurePoint.Position, 3);
+                }
             }
         }
 
         /// <summary>
         /// Displays a single line showing the types and sizes of the expected
-        /// and actual collections or arrays. If both are identical, the value is 
-        /// only shown once.
+        /// and actual enumerations, collections or arrays. If both are identical, 
+        /// the value is only shown once.
         /// </summary>
-		/// <param name="writer">The MessageWriter on which to display</param>
-		/// <param name="expected">The expected collection or array</param>
+        /// <param name="writer">The MessageWriter on which to display</param>
+        /// <param name="expected">The expected collection or array</param>
         /// <param name="actual">The actual collection or array</param>
-		/// <param name="indent">The indentation level for the message line</param>
-		private void DisplayCollectionTypesAndSizes(MessageWriter writer, ICollection expected, ICollection actual, int indent)
+        /// <param name="indent">The indentation level for the message line</param>
+        private void DisplayTypesAndSizes(MessageWriter writer, IEnumerable expected, IEnumerable actual, int indent)
         {
             string sExpected = MsgUtils.GetTypeRepresentation(expected);
-            if (!(expected is Array))
-                sExpected += string.Format(" with {0} elements", expected.Count);
+            if (expected is ICollection && !(expected is Array))
+                sExpected += string.Format(" with {0} elements", ((ICollection)expected).Count);
 
             string sActual = MsgUtils.GetTypeRepresentation(actual);
-            if (!(actual is Array))
-                sActual += string.Format(" with {0} elements", actual.Count);
+            if (actual is ICollection && !(actual is Array))
+                sActual += string.Format(" with {0} elements", ((ICollection)actual).Count);
 
             if (sExpected == sActual)
                 writer.WriteMessageLine(indent, CollectionType_1, sExpected);
@@ -456,12 +463,12 @@ namespace NUnit.Framework.Constraints
         /// arrays at which the comparison failed. If the arrays have different
         /// structures or dimensions, both values are shown.
         /// </summary>
-		/// <param name="writer">The MessageWriter on which to display</param>
-		/// <param name="expected">The expected array</param>
+        /// <param name="writer">The MessageWriter on which to display</param>
+        /// <param name="expected">The expected array</param>
         /// <param name="actual">The actual array</param>
         /// <param name="failurePoint">Index of the failure point in the underlying collections</param>
-		/// <param name="indent">The indentation level for the message line</param>
-		private void DisplayFailurePoint(MessageWriter writer, ICollection expected, ICollection actual, int failurePoint, int indent)
+        /// <param name="indent">The indentation level for the message line</param>
+        private void DisplayFailurePoint(MessageWriter writer, IEnumerable expected, IEnumerable actual, NUnitEqualityComparer.FailurePoint failurePoint, int indent)
         {
             Array expectedArray = expected as Array;
             Array actualArray = actual as Array;
@@ -476,14 +483,14 @@ namespace NUnit.Framework.Constraints
                     if (expectedArray.GetLength(r) != actualArray.GetLength(r))
                         useOneIndex = false;
 
-            int[] expectedIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(expected, failurePoint);
+            int[] expectedIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(expected, failurePoint.Position);
             if (useOneIndex)
             {
                 writer.WriteMessageLine(indent, ValuesDiffer_1, MsgUtils.GetArrayIndicesAsString(expectedIndices));
             }
             else
             {
-                int[] actualIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(actual, failurePoint);
+                int[] actualIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(actual, failurePoint.Position);
                 writer.WriteMessageLine(indent, ValuesDiffer_2,
                     MsgUtils.GetArrayIndicesAsString(expectedIndices), MsgUtils.GetArrayIndicesAsString(actualIndices));
             }
@@ -506,5 +513,44 @@ namespace NUnit.Framework.Constraints
             return null;
         }
         #endregion
+
+        #region DisplayEnumerableDifferences
+        /// <summary>
+        /// Display the failure information for two IEnumerables that did not match.
+        /// </summary>
+        /// <param name="writer">The MessageWriter on which to display</param>
+        /// <param name="expected">The expected enumeration.</param>
+        /// <param name="actual">The actual enumeration</param>
+        /// <param name="depth">The depth of this failure in a set of nested collections</param>
+        private void DisplayEnumerableDifferences(MessageWriter writer, IEnumerable expected, IEnumerable actual, int depth)
+        {
+            DisplayTypesAndSizes(writer, expected, actual, depth);
+
+            if (comparer.FailurePoints.Count > depth)
+            {
+                NUnitEqualityComparer.FailurePoint failurePoint = (NUnitEqualityComparer.FailurePoint)comparer.FailurePoints[depth];
+
+                DisplayFailurePoint(writer, expected, actual, failurePoint, depth);
+
+                if (failurePoint.ExpectedHasData && failurePoint.ActualHasData)
+                    DisplayDifferences(
+                        writer,
+                        failurePoint.ExpectedValue,
+                        failurePoint.ActualValue,
+                        ++depth);
+                //else if (failurePoint.ActualHasData)
+                //{
+                //    writer.Write("  Extra:    ");
+                //    writer.WriteCollectionElements(actual, failurePoint.Position, 3);
+                //}
+                //else
+                //{
+                //    writer.Write("  Missing:  ");
+                //    writer.WriteCollectionElements(expected, failurePoint.Position, 3);
+                //}
+            }
+        }
+
+        #endregion
     }
 }
diff --git a/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs b/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
index 7094736..c0bb9dd 100644
--- a/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
+++ b/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -22,47 +22,62 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Compares two objects, returning true if they are equal
         /// </summary>
-        public abstract bool ObjectsEqual(object x, object y);
+        public abstract bool AreEqual(object x, object y);
 
         /// <summary>
-        /// Returns an EqualityAdapter that wraps an IComparer.
+        /// Returns true if the two objects can be compared by this adapter.
+        /// The base adapter cannot handle IEnumerables except for strings.
         /// </summary>
-        public static EqualityAdapter For(IComparer comparer)
+        public virtual bool CanCompare(object x, object y)
         {
-            return new ComparisonAdapterAdapter(ComparisonAdapter.For(comparer));
-        }
+            if (x is string && y is string)
+                return true;
 
-#if NET_2_0
-        /// <summary>
-        /// Returns an EqualityAdapter that wraps an IEqualityComparer.
-        /// </summary>
-        public static EqualityAdapter For(IEqualityComparer comparer)
-        {
-            return new EqualityComparerAdapter(comparer);
+            if (x is IEnumerable || y is IEnumerable)
+                return false;
+
+            return true;
         }
 
+        #region Nested IComparer Adapter
+
         /// <summary>
-        /// Returns an EqualityAdapter that wraps an IEqualityComparer<T>.
+        /// Returns an EqualityAdapter that wraps an IComparer.
         /// </summary>
-        public static EqualityAdapter For<T>(IEqualityComparer<T> comparer)
+        public static EqualityAdapter For(IComparer comparer)
         {
-            return new EqualityComparerAdapter<T>(comparer);
+            return new ComparerAdapter(comparer);
         }
 
         /// <summary>
-        /// Returns an EqualityAdapter that wraps an IComparer<T>.
+        /// EqualityAdapter that wraps an IComparer.
         /// </summary>
-        public static EqualityAdapter For<T>(IComparer<T> comparer)
+        class ComparerAdapter : EqualityAdapter
         {
-            return new ComparisonAdapterAdapter( ComparisonAdapter.For(comparer) );
+            private IComparer comparer;
+
+            public ComparerAdapter(IComparer comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool AreEqual(object x, object y)
+            {
+                return comparer.Compare(x, y) == 0;
+            }
         }
 
+        #endregion
+
+#if CLR_2_0 || CLR_4_0
+        #region Nested IEqualityComparer Adapter
+
         /// <summary>
-        /// Returns an EqualityAdapter that wraps a Comparison<T>.
+        /// Returns an EqualityAdapter that wraps an IEqualityComparer.
         /// </summary>
-        public static EqualityAdapter For<T>(Comparison<T> comparer)
+        public static EqualityAdapter For(IEqualityComparer comparer)
         {
-            return new ComparisonAdapterAdapter( ComparisonAdapter.For(comparer) );
+            return new EqualityComparerAdapter(comparer);
         }
 
         class EqualityComparerAdapter : EqualityAdapter
@@ -74,47 +89,143 @@ namespace NUnit.Framework.Constraints
                 this.comparer = comparer;
             }
 
-            public override bool ObjectsEqual(object x, object y)
+            public override bool AreEqual(object x, object y)
             {
                 return comparer.Equals(x, y);
             }
         }
 
-        class EqualityComparerAdapter<T> : EqualityAdapter
-        {
-            private IEqualityComparer<T> comparer;
+        #endregion
 
-            public EqualityComparerAdapter(IEqualityComparer<T> comparer)
+        #region Nested GenericEqualityAdapter<T>
+
+        abstract class GenericEqualityAdapter<T> : EqualityAdapter
+        {
+            /// <summary>
+            /// Returns true if the two objects can be compared by this adapter.
+            /// Generic adapter requires objects of the specified type.
+            /// </summary>
+            public override bool CanCompare(object x, object y)
             {
-                this.comparer = comparer;
+                return typeof(T).IsAssignableFrom(x.GetType())
+                    && typeof(T).IsAssignableFrom(y.GetType());
             }
 
-            public override bool ObjectsEqual(object x, object y)
+            protected void ThrowIfNotCompatible(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());
+                    throw new ArgumentException("Cannot compare " + y.ToString());
+            }
+        }
+
+        #endregion
+
+        #region Nested IEqualityComparer<T> Adapter
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IEqualityComparer<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(IEqualityComparer<T> comparer)
+        {
+            return new EqualityComparerAdapter<T>(comparer);
+        }
+
+        class EqualityComparerAdapter<T> : GenericEqualityAdapter<T>
+        {
+            private IEqualityComparer<T> comparer;
 
+            public EqualityComparerAdapter(IEqualityComparer<T> comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool AreEqual(object x, object y)
+            {
+                ThrowIfNotCompatible(x, y);
                 return comparer.Equals((T)x, (T)y);
             }
         }
-#endif
 
-        class ComparisonAdapterAdapter : EqualityAdapter
+        #endregion
+
+        #region Nested IComparer<T> Adapter
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IComparer<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(IComparer<T> comparer)
         {
-            private ComparisonAdapter comparer;
+            return new ComparerAdapter<T>(comparer);
+        }
 
-            public ComparisonAdapterAdapter(ComparisonAdapter comparer)
+        /// <summary>
+        /// EqualityAdapter that wraps an IComparer.
+        /// </summary>
+        class ComparerAdapter<T> : GenericEqualityAdapter<T>
+        {
+            private IComparer<T> comparer;
+
+            public ComparerAdapter(IComparer<T> comparer)
             {
                 this.comparer = comparer;
             }
 
-            public override bool ObjectsEqual(object x, object y)
+            public override bool AreEqual(object x, object y)
             {
-                return comparer.Compare(x, y) == 0;
+                ThrowIfNotCompatible(x, y);
+                return comparer.Compare((T)x, (T)y) == 0;
+            }
+        }
+
+        #endregion
+
+        #region Nested Comparison<T> Adapter
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps a Comparison<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(Comparison<T> comparer)
+        {
+            return new ComparisonAdapter<T>(comparer);
+        }
+
+        class ComparisonAdapter<T> : GenericEqualityAdapter<T>
+        {
+            private Comparison<T> comparer;
+
+            public ComparisonAdapter(Comparison<T> comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool AreEqual(object x, object y)
+            {
+                ThrowIfNotCompatible(x, y);
+                return comparer.Invoke((T)x, (T)y) == 0;
             }
         }
+
+        #endregion
+
+#endif
     }
+
+#if CLR_2_0x || CLR_4_0x
+    /// <summary>
+    /// EqualityAdapter class handles all equality comparisons
+    /// that use an IEqualityComparer, IEqualityComparer<T>
+    /// or a ComparisonAdapter.
+    /// </summary>
+    public abstract class EqualityAdapter<T> : EqualityAdapter, INUnitEqualityComparer<T>
+    {
+        /// <summary>
+        /// Compares two objects, returning true if they are equal
+        /// </summary>
+        public abstract bool AreEqual(T x, T y, ref Tolerance tolerance);
+
+    }
+#endif
 }
diff --git a/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs b/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs
new file mode 100644
index 0000000..29e8c2b
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Tests whether a value is greater than the value supplied to its constructor
+    /// </summary>
+    public class GreaterThanConstraint : ComparisonConstraint
+    {
+        /// <summary>
+        /// The value against which a comparison is to be made
+        /// </summary>
+        private object expected;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:GreaterThanConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        public GreaterThanConstraint(object expected) : base(expected)
+        {
+            this.expected = expected;
+        }
+
+        /// <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("greater than");
+            writer.WriteExpectedValue(expected);
+        }
+
+        /// <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 (expected == null || actual == null)
+                throw new ArgumentException("Cannot compare using a null reference");
+
+            return comparer.Compare(actual, expected) > 0;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/GreaterThanOrEqualConstraint.cs b/src/NUnitFramework/framework/Constraints/GreaterThanOrEqualConstraint.cs
new file mode 100644
index 0000000..f843452
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/GreaterThanOrEqualConstraint.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Tests whether a value is greater than or equal to the value supplied to its constructor
+    /// </summary>
+    public class GreaterThanOrEqualConstraint : ComparisonConstraint
+    {
+        /// <summary>
+        /// The value against which a comparison is to be made
+        /// </summary>
+        private object expected;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:GreaterThanOrEqualConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        public GreaterThanOrEqualConstraint(object expected) : base(expected)
+        {
+            this.expected = expected;
+        }
+
+        /// <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("greater than or equal to");
+            writer.WriteExpectedValue(expected);
+        }
+
+        /// <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 (expected == null || actual == null)
+                throw new ArgumentException("Cannot compare using a null reference");
+
+            return comparer.Compare(actual, expected) >= 0;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs b/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs
new file mode 100644
index 0000000..da84d6a
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Tests whether a value is less than the value supplied to its constructor
+    /// </summary>
+    public class LessThanConstraint : ComparisonConstraint
+    {
+        /// <summary>
+        /// The value against which a comparison is to be made
+        /// </summary>
+        private object expected;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:LessThanConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        public LessThanConstraint(object expected) : base(expected) 
+        {
+            this.expected = expected;
+        }
+
+        /// <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("less than");
+            writer.WriteExpectedValue(expected);
+        }
+
+        /// <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 (expected == null || actual == null)
+                throw new ArgumentException("Cannot compare using a null reference");
+
+            return comparer.Compare(actual, expected) < 0;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/LessThanOrEqualConstraint.cs b/src/NUnitFramework/framework/Constraints/LessThanOrEqualConstraint.cs
new file mode 100644
index 0000000..abacb6f
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/LessThanOrEqualConstraint.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Tests whether a value is less than or equal to the value supplied to its constructor
+    /// </summary>
+    public class LessThanOrEqualConstraint : ComparisonConstraint
+    {
+        /// <summary>
+        /// The value against which a comparison is to be made
+        /// </summary>
+        private object expected;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:LessThanOrEqualConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        public LessThanOrEqualConstraint(object expected) : base(expected) 
+        {
+            this.expected = expected;
+        }
+
+        /// <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("less than or equal to");
+            writer.WriteExpectedValue(expected);
+        }
+
+        /// <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 (expected == null || actual == null)
+                throw new ArgumentException("Cannot compare using a null reference");
+
+            return comparer.Compare(actual, expected) <= 0;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/MessageWriter.cs b/src/NUnitFramework/framework/Constraints/MessageWriter.cs
index eb27d65..abcc9c2 100644
--- a/src/NUnitFramework/framework/Constraints/MessageWriter.cs
+++ b/src/NUnitFramework/framework/Constraints/MessageWriter.cs
@@ -132,6 +132,6 @@ namespace NUnit.Framework.Constraints
 		/// <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);
+		public abstract void WriteCollectionElements(IEnumerable collection, int start, int max);
 	}
 }
diff --git a/src/NUnitFramework/framework/Constraints/MsgUtils.cs b/src/NUnitFramework/framework/Constraints/MsgUtils.cs
index 0cee3af..e714f1d 100644
--- a/src/NUnitFramework/framework/Constraints/MsgUtils.cs
+++ b/src/NUnitFramework/framework/Constraints/MsgUtils.cs
@@ -143,13 +143,14 @@ namespace NUnit.Framework.Constraints
         }
 
         /// <summary>
-        /// Get an array of indices representing the point in a collection or
-        /// array corresponding to a single int index into the collection.
+        /// Get an array of indices representing the point in a enumerable, 
+        /// 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)
+        public static int[] GetArrayIndicesFromCollectionIndex(IEnumerable collection, int index)
         {
             Array array = collection as Array;
 
diff --git a/src/NUnitFramework/framework/Constraints/NUnitComparer.cs b/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
index 1a41c1c..ece5975 100644
--- a/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
+++ b/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
@@ -8,7 +8,7 @@ using System;
 using System.IO;
 using System.Reflection;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -64,4 +64,35 @@ namespace NUnit.Framework.Constraints
             throw new ArgumentException("Neither value implements IComparable or IComparable<T>");
         }
     }
+
+#if CLR_2_0 || CLR_4_0
+    /// <summary>
+    /// Generic version of NUnitComparer
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class NUnitComparer<T> : IComparer<T>
+    {
+        /// <summary>
+        /// Compare two objects of the same type
+        /// </summary>
+        public int Compare(T x, T 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<T>)
+                return ((IComparable<T>)x).CompareTo(y);
+
+            if (x is IComparable)
+                return ((IComparable)x).CompareTo(y);
+
+            throw new ArgumentException("Neither value implements IComparable or IComparable<T>");
+        }
+    }
+#endif
 }
diff --git a/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs b/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
index fdb0595..5eea93c 100644
--- a/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
+++ b/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
@@ -7,8 +7,9 @@
 using System;
 using System.IO;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
+using System.Reflection;
 #endif
 
 namespace NUnit.Framework.Constraints
@@ -17,7 +18,7 @@ namespace NUnit.Framework.Constraints
     /// NUnitEqualityComparer encapsulates NUnit's handling of
     /// equality tests between objects.
     /// </summary>
-    public class NUnitEqualityComparer
+    public class NUnitEqualityComparer : INUnitEqualityComparer
     {
         #region Static and Instance Fields
         /// <summary>
@@ -32,15 +33,9 @@ namespace NUnit.Framework.Constraints
         private bool compareAsCollection;
 
         /// <summary>
-        /// If non-zero, equality comparisons within the specified 
-        /// tolerance will succeed.
+        /// Comparison objects used in comparisons for some constraints.
         /// </summary>
-        private Tolerance tolerance = Tolerance.Empty;
-
-        /// <summary>
-        /// Comparison object used in comparisons for some constraints.
-        /// </summary>
-        private EqualityAdapter externalComparer;
+        private ArrayList externalComparers = new ArrayList();
 
         private ArrayList failurePoints;
 
@@ -81,20 +76,9 @@ namespace NUnit.Framework.Constraints
         /// 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
+        public IList ExternalComparers
         {
-            get { return tolerance; }
-            set { tolerance = value; }
+            get { return externalComparers; }
         }
 
         /// <summary>
@@ -104,13 +88,15 @@ namespace NUnit.Framework.Constraints
         {
             get { return failurePoints; }
         }
+
         #endregion
 
         #region Public Methods
+
         /// <summary>
-        /// Compares two objects for equality.
+        /// Compares two objects for equality within a tolerance.
         /// </summary>
-        public bool ObjectsEqual(object x, object y)
+        public bool AreEqual(object x, object y, ref Tolerance tolerance)
         {
             this.failurePoints = new ArrayList();
 
@@ -126,20 +112,21 @@ namespace NUnit.Framework.Constraints
             Type xType = x.GetType();
             Type yType = y.GetType();
 
+            EqualityAdapter externalComparer = GetExternalComparer(x, y);
+            if (externalComparer != null)
+                return externalComparer.AreEqual(x, y);
+
             if (xType.IsArray && yType.IsArray && !compareAsCollection)
-                return ArraysEqual((Array)x, (Array)y);
+                return ArraysEqual((Array)x, (Array)y, ref tolerance);
 
             if (x is IDictionary && y is IDictionary)
-                return DictionariesEqual((IDictionary)x, (IDictionary)y);
+                return DictionariesEqual((IDictionary)x, (IDictionary)y, ref tolerance);
 
-            if (x is ICollection && y is ICollection)
-                return CollectionsEqual((ICollection)x, (ICollection)y);
+            //if (x is ICollection && y is ICollection)
+            //    return CollectionsEqual((ICollection)x, (ICollection)y, ref tolerance);
 
             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);
+                return EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance);
 
             if (x is string && y is string)
                 return StringsEqual((string)x, (string)y);
@@ -164,15 +151,67 @@ namespace NUnit.Framework.Constraints
                     return ((TimeSpan)x - (TimeSpan)y).Duration() <= amount;
             }
 
+#if CLR_2_0 || CLR_4_0
+            if (FirstImplementsIEquatableOfSecond(xType, yType))
+                return InvokeFirstIEquatableEqualsSecond(x, y);
+            else if (FirstImplementsIEquatableOfSecond(yType, xType))
+                return InvokeFirstIEquatableEqualsSecond(y, x);
+#endif
+
             return x.Equals(y);
         }
-        #endregion
+
+#if CLR_2_0 || CLR_4_0
+    	private static bool FirstImplementsIEquatableOfSecond(Type first, Type second)
+    	{
+    		Type[] equatableArguments = GetEquatableGenericArguments(first);
+
+    		foreach (var xEquatableArgument in equatableArguments)
+    			if (xEquatableArgument.Equals(second))
+    				return true;
+
+    		return false;
+    	}
+
+    	private static Type[] GetEquatableGenericArguments(Type type)
+    	{
+    		return Array.ConvertAll(Array.FindAll(type.GetInterfaces(),
+                                    delegate(Type @interface)
+                                    {
+                                  	    return @interface.IsGenericType &&
+                                  	           @interface.GetGenericTypeDefinition().Equals(typeof (IEquatable<>));
+                                    }),
+								    delegate(Type iEquatableInterface)
+								    {
+								  	    return iEquatableInterface.GetGenericArguments()[0];
+								    });
+    	}
+
+    	private static bool InvokeFirstIEquatableEqualsSecond(object first, object second)
+    	{
+    		MethodInfo equals = typeof (IEquatable<>).MakeGenericType(second.GetType()).GetMethod("Equals");
+
+    		return (bool) equals.Invoke(first, new object[] {second});
+    	}
+#endif
+
+    	#endregion
 
         #region Helper Methods
+
+        private EqualityAdapter GetExternalComparer(object x, object y)
+        {
+            foreach (EqualityAdapter adapter in externalComparers)
+                if (adapter.CanCompare(x, y))
+                    return adapter;
+
+            return null;
+        }
+
         /// <summary>
         /// Helper method to compare two arrays
         /// </summary>
-        private bool ArraysEqual(Array x, Array y)
+        private bool ArraysEqual(Array x, Array y, ref Tolerance tolerance)
         {
             int rank = x.Rank;
 
@@ -183,10 +222,10 @@ namespace NUnit.Framework.Constraints
                 if (x.GetLength(r) != y.GetLength(r))
                     return false;
 
-            return CollectionsEqual((ICollection)x, (ICollection)y);
+            return EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance);
         }
 
-        private bool DictionariesEqual(IDictionary x, IDictionary y)
+        private bool DictionariesEqual(IDictionary x, IDictionary y, ref Tolerance tolerance)
         {
             if (x.Count != y.Count)
                 return false;
@@ -196,29 +235,41 @@ namespace NUnit.Framework.Constraints
                 return false;
 
             foreach (object key in x.Keys)
-                if (!ObjectsEqual(x[key], y[key]))
+                if (!AreEqual(x[key], y[key], ref tolerance))
                     return false;
 
             return true;
         }
 
-        private bool CollectionsEqual(ICollection x, ICollection y)
+        private bool CollectionsEqual(ICollection x, ICollection y, ref Tolerance tolerance)
         {
             IEnumerator expectedEnum = x.GetEnumerator();
             IEnumerator actualEnum = y.GetEnumerator();
 
             int count;
-            for (count = 0; expectedEnum.MoveNext() && actualEnum.MoveNext(); count++)
+            for (count = 0; ; count++)
             {
-                if (!ObjectsEqual(expectedEnum.Current, actualEnum.Current))
-                    break;
-            }
+                bool expectedHasData = expectedEnum.MoveNext();
+                bool actualHasData = actualEnum.MoveNext();
 
-            if (count == x.Count && count == y.Count)
-                return true;
+                if (!expectedHasData && !actualHasData)
+                    return true;
 
-            failurePoints.Insert(0, count);
-            return false;
+                if (expectedHasData != actualHasData ||
+                    !AreEqual(expectedEnum.Current, actualEnum.Current, ref tolerance))
+                {
+                    FailurePoint fp = new FailurePoint();
+                    fp.Position = count;
+                    fp.ExpectedHasData = expectedHasData;
+                    if (expectedHasData)
+                        fp.ExpectedValue = expectedEnum.Current;
+                    fp.ActualHasData = actualHasData;
+                    if (actualHasData)
+                        fp.ActualValue = actualEnum.Current;
+                    failurePoints.Insert(0, fp);
+                    return false;
+                }
+            }
         }
 
         private bool StringsEqual(string x, string y)
@@ -229,13 +280,13 @@ namespace NUnit.Framework.Constraints
             return s1.Equals(s2);
         }
 
-        private bool EnumerablesEqual(IEnumerable x, IEnumerable y)
+        private bool EnumerablesEqual(IEnumerable x, IEnumerable y, ref Tolerance tolerance)
         {
             IEnumerator expectedEnum = x.GetEnumerator();
             IEnumerator actualEnum = y.GetEnumerator();
 
-            int count = 0;
-            for (; ; )
+            int count;
+            for (count = 0; ; count++)
             {
                 bool expectedHasData = expectedEnum.MoveNext();
                 bool actualHasData = actualEnum.MoveNext();
@@ -244,9 +295,17 @@ namespace NUnit.Framework.Constraints
                     return true;
 
                 if (expectedHasData != actualHasData ||
-                    !ObjectsEqual(expectedEnum.Current, actualEnum.Current))
+                    !AreEqual(expectedEnum.Current, actualEnum.Current, ref tolerance))
                 {
-                    failurePoints.Insert(0, count);
+                    FailurePoint fp = new FailurePoint();
+                    fp.Position = count;
+                    fp.ExpectedHasData = expectedHasData;
+                    if (expectedHasData)
+                            fp.ExpectedValue = expectedEnum.Current;
+                    fp.ActualHasData = actualHasData;
+                    if (actualHasData)
+                        fp.ActualValue = actualEnum.Current;
+                    failurePoints.Insert(0, fp);
                     return false;
                 }
             }
@@ -326,5 +385,41 @@ namespace NUnit.Framework.Constraints
             return true;
         }
         #endregion
+
+        #region Nested FailurePoint Class
+
+        /// <summary>
+        /// FailurePoint class represents one point of failure
+        /// in an equality test.
+        /// </summary>
+        public class FailurePoint
+        {
+            /// <summary>
+            /// The location of the failure
+            /// </summary>
+            public int Position;
+
+            /// <summary>
+            /// The expected value
+            /// </summary>
+            public object ExpectedValue;
+
+            /// <summary>
+            /// The actual value
+            /// </summary>
+            public object ActualValue;
+
+            /// <summary>
+            /// Indicates whether the expected value is valid
+            /// </summary>
+            public bool ExpectedHasData;
+
+            /// <summary>
+            /// Indicates whether the actual value is valid
+            /// </summary>
+            public bool ActualHasData;
+        }
+
+        #endregion
     }
 }
diff --git a/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs b/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
index 7e89bcb..4058932 100644
--- a/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
@@ -4,7 +4,7 @@
 // obtain a copy of the license at http://nunit.org
 // ****************************************************************
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System;
 using System.Collections.Generic;
 
diff --git a/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs b/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
index d08abb2..54387d0 100644
--- a/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
@@ -223,4 +223,71 @@ namespace NUnit.Framework.Constraints
 		}
 	}
 	#endregion
+
+    #region ExactCountConstraint
+    /// <summary>
+    /// ExactCoutConstraint applies another constraint to each
+    /// item in a collection, succeeding only if a specified
+    /// number of items succeed.
+    /// </summary>
+    public class ExactCountConstraint : PrefixConstraint
+    {
+        private int expectedCount;
+
+        /// <summary>
+        /// Construct an ExactCountConstraint on top of an existing constraint
+        /// </summary>
+        /// <param name="expectedCount"></param>
+        /// <param name="itemConstraint"></param>
+        public ExactCountConstraint(int expectedCount, Constraint itemConstraint)
+            : base(itemConstraint)
+        {
+            this.DisplayName = "one";
+            this.expectedCount = expectedCount;
+        }
+
+        /// <summary>
+        /// Apply the item constraint to each item in the collection,
+        /// succeeding only if the expected number of items pass.
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (!(actual is IEnumerable))
+                throw new ArgumentException("The actual value must be an IEnumerable", "actual");
+
+            int count = 0;
+            foreach (object item in (IEnumerable)actual)
+                if (baseConstraint.Matches(item))
+                    count++;
+
+            return count == expectedCount;
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            switch(expectedCount)
+            {
+                case 0:
+                    writer.WritePredicate("no item");
+                    break;
+                case 1:
+                    writer.WritePredicate("exactly one item");
+                    break;
+                default:
+                    writer.WritePredicate("exactly " + expectedCount.ToString() + " items");
+                    break;
+            }
+
+            baseConstraint.WriteDescriptionTo(writer);
+        }
+    }
+    #endregion
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Constraints/RangeConstraint.cs b/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
index 425fd11..6443486 100644
--- a/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -16,22 +16,23 @@ namespace NUnit.Framework.Constraints
     /// RangeConstraint tests whethe two values are within a 
     /// specified range.
     /// </summary>
-    public class RangeConstraint : Constraint
+#if CLR_2_0 || CLR_4_0
+    public class RangeConstraint<T> : ComparisonConstraint where T : IComparable<T>
     {
-        private IComparable from;
-        private IComparable to;
-
-        private ComparisonAdapter comparer = ComparisonAdapter.Default;
+        private T from;
+        private T to;
 
         /// <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 )
+        public RangeConstraint(T from, T to)
+            : base(from, to)
         {
             this.from = from;
             this.to = to;
+            this.comparer = ComparisonAdapter.For(new NUnitComparer<T>());
         }
 
         /// <summary>
@@ -43,8 +44,8 @@ namespace NUnit.Framework.Constraints
         {
             this.actual = actual;
 
-            if ( from == null || to == null || actual == null)
-                throw new ArgumentException( "Cannot compare using a null reference", "expected" );
+            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;
@@ -59,34 +60,49 @@ namespace NUnit.Framework.Constraints
 
             writer.Write("in range ({0},{1})", from, to);
         }
+    }
+#else
+    public class RangeConstraint : ComparisonConstraint
+    {
+        private IComparable from;
+        private IComparable to;
 
         /// <summary>
-        /// Modifies the constraint to use an IComparer and returns self.
+        /// Initializes a new instance of the <see cref="T:RangeConstraint"/> class.
         /// </summary>
-        public RangeConstraint Using(IComparer comparer)
+        /// <param name="from">From.</param>
+        /// <param name="to">To.</param>
+        public RangeConstraint(IComparable from, IComparable to) : base( from, to )
         {
-            this.comparer = ComparisonAdapter.For(comparer);
-            return this;
+            this.from = from;
+            this.to = to;
         }
 
-#if NET_2_0
         /// <summary>
-        /// Modifies the constraint to use an IComparer<T> and returns self.
+        /// Test whether the constraint is satisfied by a given value
         /// </summary>
-        public RangeConstraint Using<T>(IComparer<T> comparer)
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
         {
-            this.comparer = ComparisonAdapter.For(comparer);
-            return this;
+            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>
-        /// Modifies the constraint to use a Comparison<T> and returns self.
+        /// Write the constraint description to a MessageWriter
         /// </summary>
-        public RangeConstraint Using<T>(Comparison<T> comparer)
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
         {
-            this.comparer = ComparisonAdapter.For(comparer);
-            return this;
+
+            writer.Write("in range ({0},{1})", from, to);
         }
-#endif
     }
+#endif
 }
diff --git a/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs b/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
index dad4eea..388db08 100644
--- a/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
 {
diff --git a/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs b/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
index 2c11e27..a4d2cdb 100644
--- a/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
@@ -65,7 +65,7 @@ namespace NUnit.Framework.Constraints
             return baseConstraint == null || baseConstraint.Matches(caughtException);
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Converts an ActualValueDelegate to a TestDelegate
         /// before calling the primary overload.
@@ -154,9 +154,9 @@ namespace NUnit.Framework.Constraints
             }
 
 			return this.caughtException == null;
-		}
+        }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Converts an ActualValueDelegate to a TestDelegate
         /// before calling the primary overload.
diff --git a/src/NUnitFramework/framework/Constraints/Tolerance.cs b/src/NUnitFramework/framework/Constraints/Tolerance.cs
index a068396..9f72a58 100644
--- a/src/NUnitFramework/framework/Constraints/Tolerance.cs
+++ b/src/NUnitFramework/framework/Constraints/Tolerance.cs
@@ -58,8 +58,10 @@ namespace NUnit.Framework.Constraints
             "A numeric tolerance is required";
 
         /// <summary>
-        /// Returns an empty Tolerance object, equivalent to 
-        /// specifying an exact match.
+        /// Returns an empty Tolerance object, equivalent to
+        /// specifying no tolerance. In most cases, it results
+        /// in an exact match but for floats and doubles a
+        /// default tolerance may be used.
         /// </summary>
         public static Tolerance Empty
         {
@@ -67,6 +69,15 @@ namespace NUnit.Framework.Constraints
         }
 
         /// <summary>
+        /// Returns a zero Tolerance object, equivalent to 
+        /// specifying an exact match.
+        /// </summary>
+        public static Tolerance Zero
+        {
+            get { return new Tolerance(0, ToleranceMode.Linear); }
+        }
+
+        /// <summary>
         /// Constructs a linear tolerance of a specdified amount
         /// </summary>
         public Tolerance(object amount) : this(amount, ToleranceMode.Linear) { }
@@ -74,7 +85,7 @@ namespace NUnit.Framework.Constraints
         /// <summary>
         /// Constructs a tolerance given an amount and ToleranceMode
         /// </summary>
-        private Tolerance(object amount, ToleranceMode mode)
+        public Tolerance(object amount, ToleranceMode mode)
         {
             this.amount = amount;
             this.mode = mode;
diff --git a/src/NUnitFramework/framework/Constraints/TypeConstraints.cs b/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
index b94d7e5..a43bf05 100644
--- a/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
+++ b/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
@@ -77,6 +77,37 @@ namespace NUnit.Framework.Constraints
     }
 
     /// <summary>
+    /// ExceptionTypeConstraint is a special version of ExactTypeConstraint
+    /// used to provided detailed info about the exception thrown in
+    /// an error message.
+    /// </summary>
+    public class ExceptionTypeConstraint : ExactTypeConstraint
+    {
+        /// <summary>
+        /// Constructs an ExceptionTypeConstraint
+        /// </summary>
+        public ExceptionTypeConstraint(Type type) : base(type) { }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. Overriden to write additional information 
+        /// in the case of an Exception.
+        /// </summary>
+        /// <param name="writer">The MessageWriter to use</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            Exception ex = actual as Exception;
+            base.WriteActualValueTo(writer);
+
+            if (ex != null)
+            {
+                writer.WriteLine(" ({0})", ex.Message);
+                writer.Write(ex.StackTrace);
+            }
+        }
+    }
+
+    /// <summary>
     /// InstanceOfTypeConstraint is used to test that an object
     /// is of the same type provided or derived from it.
     /// </summary>
diff --git a/src/NUnitFramework/framework/Contains.cs b/src/NUnitFramework/framework/Contains.cs
index c838fd2..02456db 100644
--- a/src/NUnitFramework/framework/Contains.cs
+++ b/src/NUnitFramework/framework/Contains.cs
@@ -1,25 +1,8 @@
-// ***********************************************************************
-// 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.
-// ***********************************************************************
+// ****************************************************************
+// Copyright 2012, 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;
diff --git a/src/NUnitFramework/framework/Has.cs b/src/NUnitFramework/framework/Has.cs
index b361cf5..650835d 100644
--- a/src/NUnitFramework/framework/Has.cs
+++ b/src/NUnitFramework/framework/Has.cs
@@ -4,14 +4,6 @@
 // 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;
@@ -25,7 +17,7 @@ namespace NUnit.Framework
     public class Has
     {
         #region No
-        
+
         /// <summary>
         /// Returns a ConstraintExpression that negates any
         /// following constraint.
@@ -34,11 +26,11 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().Not; }
         }
-        
+
         #endregion
-        
+
         #region All
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -48,11 +40,11 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().All; }
         }
-        
+
         #endregion
-        
+
         #region Some
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -62,11 +54,11 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().Some; }
         }
-        
+
         #endregion
-        
+
         #region None
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -76,11 +68,25 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().None; }
         }
-        
+
+        #endregion
+
+        #region Exactly(n)
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding only if a specified number of them succeed.
+        /// </summary>
+        public static ConstraintExpression Exactly(int expectedCount)
+        {
+            return new ConstraintExpression().Exactly(expectedCount);
+        }
+
         #endregion
-        
+
         #region Property
-        
+
         /// <summary>
         /// Returns a new PropertyConstraintExpression, which will either
         /// test for the existence of the named property on the object
@@ -90,11 +96,11 @@ namespace NUnit.Framework
         {
             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.
@@ -103,11 +109,11 @@ namespace NUnit.Framework
         {
             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.
@@ -116,11 +122,11 @@ namespace NUnit.Framework
         {
             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.
@@ -129,11 +135,11 @@ namespace NUnit.Framework
         {
             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.
@@ -142,11 +148,11 @@ namespace NUnit.Framework
         {
             get { return Property("InnerException"); }
         }
-        
+
         #endregion
-        
+
         #region Attribute
-        
+
         /// <summary>
         /// Returns a new AttributeConstraint checking for the
         /// presence of a particular attribute on an object.
@@ -155,8 +161,8 @@ namespace NUnit.Framework
         {
             return new ConstraintExpression().Attribute(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a new AttributeConstraint checking for the
         /// presence of a particular attribute on an object.
@@ -165,12 +171,12 @@ namespace NUnit.Framework
         {
             return Attribute(typeof(T));
         }
-        
 #endif
+
         #endregion
-        
+
         #region Member
-        
+
         /// <summary>
         /// Returns a new CollectionContainsConstraint checking for the
         /// presence of a particular object in the collection.
@@ -179,8 +185,8 @@ namespace NUnit.Framework
         {
             return new CollectionContainsConstraint(expected);
         }
-        
+
         #endregion
-        
+
     }
 }
diff --git a/src/NUnitFramework/framework/ITestCaseData.cs b/src/NUnitFramework/framework/ITestCaseData.cs
index 10203dc..a642167 100644
--- a/src/NUnitFramework/framework/ITestCaseData.cs
+++ b/src/NUnitFramework/framework/ITestCaseData.cs
@@ -33,6 +33,13 @@ namespace NUnit.Framework
         object Result { get; }
 
         /// <summary>
+        /// Indicates whether a result has been specified.
+        /// This is necessary because the result may be
+        /// null, so it's value cannot be checked.
+        /// </summary>
+        bool HasExpectedResult { get; }
+
+        /// <summary>
         ///  Gets the expected exception Type
         /// </summary>
         Type ExpectedException { get; }
@@ -59,6 +66,12 @@ namespace NUnit.Framework
         bool Ignored { get; }
 
         /// <summary>
+        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is explicit.
+        /// </summary>
+        /// <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        bool Explicit { get; }
+
+        /// <summary>
         /// Gets the ignore reason.
         /// </summary>
         /// <value>The ignore reason.</value>
diff --git a/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs b/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs
new file mode 100644
index 0000000..8df7996
--- /dev/null
+++ b/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs
@@ -0,0 +1,43 @@
+// ****************************************************************
+// Copyright 2012, 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>
+    public interface INUnitEqualityComparer
+    {
+        /// <summary>
+        /// Compares two objects for equality within a tolerance
+        /// </summary>
+        /// <param name="x">The first object to compare</param>
+        /// <param name="y">The second object to compare</param>
+        /// <param name="tolerance">The tolerance to use in the comparison</param>
+        /// <returns></returns>
+        bool AreEqual(object x, object y, ref NUnit.Framework.Constraints.Tolerance tolerance);
+    }
+
+#if CLR_2_0 || CLR_4_0
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public interface INUnitEqualityComparer<T>
+    {
+        /// <summary>
+        /// Compares two objects of a given Type for equality within a tolerance
+        /// </summary>
+        /// <param name="x">The first object to compare</param>
+        /// <param name="y">The second object to compare</param>
+        /// <param name="tolerance">The tolerance to use in the comparison</param>
+        /// <returns></returns>
+        bool AreEqual(T x, T y, ref NUnit.Framework.Constraints.Tolerance tolerance);
+    }
+#endif
+}
diff --git a/src/NUnitFramework/framework/Interfaces/ITestAction.cs b/src/NUnitFramework/framework/Interfaces/ITestAction.cs
new file mode 100644
index 0000000..c6e3d0c
--- /dev/null
+++ b/src/NUnitFramework/framework/Interfaces/ITestAction.cs
@@ -0,0 +1,38 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// When implemented by an attribute, this interface implemented to provide actions to execute before and after tests.
+    /// </summary>
+    public interface ITestAction
+    {
+        /// <summary>
+        /// Executed before each test is run
+        /// </summary>
+        /// <param name="testDetails">Provides details about the test that is going to be run.</param>
+        void BeforeTest(TestDetails testDetails);
+
+        /// <summary>
+        /// Executed after each test is run
+        /// </summary>
+        /// <param name="testDetails">Provides details about the test that has just been run.</param>
+        void AfterTest(TestDetails testDetails);
+
+
+        /// <summary>
+        /// Provides the target for the action attribute
+        /// </summary>
+        /// <returns>The target for the action attribute</returns>
+        ActionTargets Targets { get; }
+    }
+}
+#endif
diff --git a/src/NUnitFramework/framework/Is.cs b/src/NUnitFramework/framework/Is.cs
index bcb1ce8..aabb33e 100644
--- a/src/NUnitFramework/framework/Is.cs
+++ b/src/NUnitFramework/framework/Is.cs
@@ -4,14 +4,6 @@
 // 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;
@@ -25,7 +17,7 @@ namespace NUnit.Framework
     public class Is
     {
         #region Not
-        
+
         /// <summary>
         /// Returns a ConstraintExpression that negates any
         /// following constraint.
@@ -34,11 +26,11 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().Not; }
         }
-        
+
         #endregion
-        
+
         #region All
-        
+
         /// <summary>
         /// Returns a ConstraintExpression, which will apply
         /// the following constraint to all members of a collection,
@@ -48,11 +40,11 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().All; }
         }
-        
+
         #endregion
-        
+
         #region Null
-        
+
         /// <summary>
         /// Returns a constraint that tests for null
         /// </summary>
@@ -60,11 +52,11 @@ namespace NUnit.Framework
         {
             get { return new NullConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region True
-        
+
         /// <summary>
         /// Returns a constraint that tests for True
         /// </summary>
@@ -72,11 +64,11 @@ namespace NUnit.Framework
         {
             get { return new TrueConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region False
-        
+
         /// <summary>
         /// Returns a constraint that tests for False
         /// </summary>
@@ -84,11 +76,35 @@ namespace NUnit.Framework
         {
             get { return new FalseConstraint(); }
         }
-        
+
+        #endregion
+
+        #region Positive
+
+        /// <summary>
+        /// Returns a constraint that tests for a positive value
+        /// </summary>
+        public static GreaterThanConstraint Positive
+        {
+            get { return new GreaterThanConstraint(0); }
+        }
+
+        #endregion
+
+        #region Negative
+
+        /// <summary>
+        /// Returns a constraint that tests for a negative value
+        /// </summary>
+        public static LessThanConstraint Negative
+        {
+            get { return new LessThanConstraint(0); }
+        }
+
         #endregion
-        
+
         #region NaN
-        
+
         /// <summary>
         /// Returns a constraint that tests for NaN
         /// </summary>
@@ -96,11 +112,11 @@ namespace NUnit.Framework
         {
             get { return new NaNConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region Empty
-        
+
         /// <summary>
         /// Returns a constraint that tests for empty
         /// </summary>
@@ -108,11 +124,11 @@ namespace NUnit.Framework
         {
             get { return new EmptyConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region Unique
-        
+
         /// <summary>
         /// Returns a constraint that tests whether a collection 
         /// contains all unique items.
@@ -121,11 +137,11 @@ namespace NUnit.Framework
         {
             get { return new UniqueItemsConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region BinarySerializable
-        
+
         /// <summary>
         /// Returns a constraint that tests whether an object graph is serializable in binary format.
         /// </summary>
@@ -133,11 +149,11 @@ namespace NUnit.Framework
         {
             get { return new BinarySerializableConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region XmlSerializable
-        
+
         /// <summary>
         /// Returns a constraint that tests whether an object graph is serializable in xml format.
         /// </summary>
@@ -145,11 +161,11 @@ namespace NUnit.Framework
         {
             get { return new XmlSerializableConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region EqualTo
-        
+
         /// <summary>
         /// Returns a constraint that tests two items for equality
         /// </summary>
@@ -157,11 +173,11 @@ namespace NUnit.Framework
         {
             return new EqualConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region SameAs
-        
+
         /// <summary>
         /// Returns a constraint that tests that two references are the same object
         /// </summary>
@@ -169,11 +185,11 @@ namespace NUnit.Framework
         {
             return new SameAsConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region GreaterThan
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is greater than the suppled argument
@@ -182,11 +198,11 @@ namespace NUnit.Framework
         {
             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
@@ -195,7 +211,7 @@ namespace NUnit.Framework
         {
             return new GreaterThanOrEqualConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is greater than or equal to the suppled argument
@@ -204,11 +220,11 @@ namespace NUnit.Framework
         {
             return new GreaterThanOrEqualConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region LessThan
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is less than the suppled argument
@@ -217,11 +233,11 @@ namespace NUnit.Framework
         {
             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
@@ -230,7 +246,7 @@ namespace NUnit.Framework
         {
             return new LessThanOrEqualConstraint(expected);
         }
-        
+
         /// <summary>
         /// Returns a constraint that tests whether the
         /// actual value is less than or equal to the suppled argument
@@ -239,11 +255,11 @@ namespace NUnit.Framework
         {
             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.
@@ -252,8 +268,8 @@ namespace NUnit.Framework
         {
             return new ExactTypeConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual
         /// value is of the exact type supplied as an argument.
@@ -262,12 +278,12 @@ namespace NUnit.Framework
         {
             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.
@@ -276,8 +292,8 @@ namespace NUnit.Framework
         {
             return new InstanceOfTypeConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is of the type supplied as an argument or a derived type.
@@ -286,8 +302,8 @@ namespace NUnit.Framework
         {
             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.
@@ -297,8 +313,8 @@ namespace NUnit.Framework
         {
             return new InstanceOfTypeConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is of the type supplied as an argument or a derived type.
@@ -308,12 +324,12 @@ namespace NUnit.Framework
         {
             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.
@@ -322,8 +338,8 @@ namespace NUnit.Framework
         {
             return new AssignableFromConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is assignable from the type supplied as an argument.
@@ -332,12 +348,12 @@ namespace NUnit.Framework
         {
             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.
@@ -346,8 +362,8 @@ namespace NUnit.Framework
         {
             return new AssignableToConstraint(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value
         /// is assignable from the type supplied as an argument.
@@ -356,12 +372,12 @@ namespace NUnit.Framework
         {
             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 
@@ -371,11 +387,11 @@ namespace NUnit.Framework
         {
             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.
@@ -384,11 +400,11 @@ namespace NUnit.Framework
         {
             return new CollectionSubsetConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region Ordered
-        
+
         /// <summary>
         /// Returns a constraint that tests whether a collection is ordered
         /// </summary>
@@ -396,11 +412,11 @@ namespace NUnit.Framework
         {
             get { return new CollectionOrderedConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region StringContaining
-        
+
         /// <summary>
         /// Returns a constraint that succeeds if the actual
         /// value contains the substring supplied as an argument.
@@ -409,11 +425,11 @@ namespace NUnit.Framework
         {
             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.
@@ -422,11 +438,11 @@ namespace NUnit.Framework
         {
             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.
@@ -435,11 +451,11 @@ namespace NUnit.Framework
         {
             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.
@@ -448,11 +464,11 @@ namespace NUnit.Framework
         {
             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.
@@ -461,11 +477,11 @@ namespace NUnit.Framework
         {
             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.
@@ -474,11 +490,11 @@ namespace NUnit.Framework
         {
             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.
@@ -487,11 +503,12 @@ namespace NUnit.Framework
         {
             return new SamePathOrUnderConstraint(expected);
         }
-        
+
         #endregion
-        
+
         #region InRange
-        
+
+#if !CLR_2_0 && !CLR_4_0
         /// <summary>
         /// Returns a constraint that tests whether the actual value falls 
         /// within a specified range.
@@ -500,8 +517,24 @@ namespace NUnit.Framework
         {
             return new RangeConstraint(from, to);
         }
-        
+#endif
+
+        #endregion
+
+        #region InRange<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public static RangeConstraint<T> InRange<T>(T from, T to) where T : IComparable<T>
+        {
+            return new RangeConstraint<T>(from, to);
+        }
+#endif
+
         #endregion
-        
+
     }
 }
diff --git a/src/NUnitFramework/framework/SyntaxElements.txt b/src/NUnitFramework/framework/SyntaxElements.txt
deleted file mode 100644
index faf2bd7..0000000
--- a/src/NUnitFramework/framework/SyntaxElements.txt
+++ /dev/null
@@ -1,786 +0,0 @@
-# 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/TestCaseData.cs b/src/NUnitFramework/framework/TestCaseData.cs
index 632b5c3..9558206 100644
--- a/src/NUnitFramework/framework/TestCaseData.cs
+++ b/src/NUnitFramework/framework/TestCaseData.cs
@@ -36,7 +36,12 @@ namespace NUnit.Framework
         /// <summary>
         /// The expected result to be returned
         /// </summary>
-        private object result;
+        private object expectedResult;
+
+        /// <summary>
+        /// Set to true if this has an expected result
+        /// </summary>
+        private bool hasExpectedResult;
 
         /// <summary>
         ///  The expected exception Type
@@ -70,6 +75,11 @@ namespace NUnit.Framework
         bool isIgnored;
 
         /// <summary>
+        /// If true, indicates that the test case is marked explicit
+        /// </summary>
+        bool isExplicit;
+
+        /// <summary>
         /// The reason for ignoring a test case
         /// </summary>
         string ignoreReason;
@@ -134,7 +144,15 @@ namespace NUnit.Framework
         /// </summary>
         public object Result
         {
-            get { return result; }
+            get { return expectedResult; }
+        }
+
+        /// <summary>
+        /// Returns true if the result has been set
+        /// </summary>
+        public bool HasExpectedResult
+        {
+            get { return hasExpectedResult; }
         }
 
         /// <summary>
@@ -179,6 +197,15 @@ namespace NUnit.Framework
         }
 
         /// <summary>
+        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is explicit.
+        /// </summary>
+        /// <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        public bool Explicit
+        {
+            get { return isExplicit; }
+        }
+
+        /// <summary>
         /// Gets the ignore reason.
         /// </summary>
         /// <value>The ignore reason.</value>
@@ -186,6 +213,7 @@ namespace NUnit.Framework
         {
             get { return ignoreReason; }
         }
+
         #endregion
 
         #region Additional Public Properties
@@ -226,7 +254,8 @@ namespace NUnit.Framework
         /// <returns>A modified TestCaseData</returns>
         public TestCaseData Returns(object result)
         {
-            this.result = result;
+            this.expectedResult = result;
+            this.hasExpectedResult = true;
             return this;
         }
 
@@ -343,6 +372,29 @@ namespace NUnit.Framework
             ignoreReason = reason;
             return this;
         }
+
+        /// <summary>
+        /// Marks this TestCase as Explicit
+        /// </summary>
+        /// <returns></returns>
+        public TestCaseData MakeExplicit()
+        {
+            isExplicit = true;
+            return this;
+        }
+
+        /// <summary>
+        /// Marks this TestCase as Explicit, specifying the reason.
+        /// </summary>
+        /// <param name="reason">The reason.</param>
+        /// <returns></returns>
+        public TestCaseData MakeExplicit(string reason)
+        {
+            isExplicit = true;
+            ignoreReason = reason;
+            return this;
+        }
+
         #endregion
     }
 }
diff --git a/src/NUnitFramework/framework/TestContext.cs b/src/NUnitFramework/framework/TestContext.cs
index b108ca6..ad027cc 100644
--- a/src/NUnitFramework/framework/TestContext.cs
+++ b/src/NUnitFramework/framework/TestContext.cs
@@ -81,7 +81,7 @@ namespace NUnit.Framework
         }
 
         /// <summary>
-        /// Gets the current directory for this TestContext
+        /// Gets the directory containing the current test assembly.
         /// </summary>
         public string TestDirectory
         {
@@ -91,6 +91,18 @@ namespace NUnit.Framework
             }
         }
 
+        /// <summary>
+        /// Gets the directory to be used for outputing files created
+        /// by this test run.
+        /// </summary>
+        public string WorkDirectory
+        {
+            get
+            {
+                return (string)_context["WorkDirectory"];
+            }
+        }
+
         #endregion
 
         #region Nested TestAdapter Class
diff --git a/src/NUnitFramework/framework/TestDetails.cs b/src/NUnitFramework/framework/TestDetails.cs
new file mode 100644
index 0000000..e380c4b
--- /dev/null
+++ b/src/NUnitFramework/framework/TestDetails.cs
@@ -0,0 +1,66 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Provides details about a test
+    /// </summary>
+    public class TestDetails
+    {
+        ///<summary>
+        /// Creates an instance of TestDetails
+        ///</summary>
+        ///<param name="fixture">The fixture that the test is a member of, if available.</param>
+        ///<param name="method">The method that implements the test, if available.</param>
+        ///<param name="fullName">The full name of the test.</param>
+        ///<param name="type">A string representing the type of test, e.g. "Test Case".</param>
+        ///<param name="isSuite">Indicates if the test represents a suite of tests.</param>
+        public TestDetails(object fixture, MethodInfo method, string fullName, string type, bool isSuite)
+        {
+            Fixture = fixture;
+            Method = method;
+
+            FullName = fullName;
+            Type = type;
+            IsSuite = isSuite;
+        }
+        
+        ///<summary>
+        /// The fixture that the test is a member of, if available.
+        ///</summary>
+        public object Fixture { get; private set; }
+
+        /// <summary>
+        /// The method that implements the test, if available.
+        /// </summary>
+        public MethodInfo Method { get; private set; }
+
+        /// <summary>
+        /// The full name of the test.
+        /// </summary>
+        public string FullName { get; private set; }
+
+        /// <summary>
+        /// A string representing the type of test, e.g. "Test Case".
+        /// </summary>
+        public string Type { get; private set; }
+
+        /// <summary>
+        /// Indicates if the test represents a suite of tests.
+        /// </summary>
+        public bool IsSuite { get; private set; }
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/TestStatus.cs b/src/NUnitFramework/framework/TestStatus.cs
index 940b87e..cf180c6 100644
--- a/src/NUnitFramework/framework/TestStatus.cs
+++ b/src/NUnitFramework/framework/TestStatus.cs
@@ -1,25 +1,8 @@
-// ***********************************************************************
-// 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.
-// ***********************************************************************
+// ****************************************************************
+// 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
+// ****************************************************************
 
 namespace NUnit.Framework
 {
diff --git a/src/NUnitFramework/framework/Text.cs b/src/NUnitFramework/framework/Text.cs
index 533c2ca..a595c3b 100644
--- a/src/NUnitFramework/framework/Text.cs
+++ b/src/NUnitFramework/framework/Text.cs
@@ -4,14 +4,6 @@
 // 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;
diff --git a/src/NUnitFramework/framework/TextMessageWriter.cs b/src/NUnitFramework/framework/TextMessageWriter.cs
index e1ae882..927a77f 100644
--- a/src/NUnitFramework/framework/TextMessageWriter.cs
+++ b/src/NUnitFramework/framework/TextMessageWriter.cs
@@ -247,10 +247,10 @@ namespace NUnit.Framework
                 Write(Fmt_Null);
             else if (val.GetType().IsArray)
                 WriteArray((Array)val);
-            else if (val is ICollection)
-                WriteCollectionElements((ICollection)val, 0, 10);
             else if (val is string)
                 WriteString((string)val);
+            else if (val is IEnumerable)
+                WriteCollectionElements((IEnumerable)val, 0, 10);
             else if (val is char)
                 WriteChar((char)val);
             else if (val is double)
@@ -274,31 +274,29 @@ namespace NUnit.Framework
         /// <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 override void WriteCollectionElements(ICollection collection, int start, int max)
+		public override void WriteCollectionElements(IEnumerable collection, int start, int max)
 		{
-			if ( collection.Count == 0 )
-			{
-				Write(Fmt_EmptyCollection);
-				return;
-			}
-
 			int count = 0;
 			int index = 0;
-			Write("< ");
 
 			foreach (object obj in collection)
 			{
-				if ( index++ >= start )
+				if ( index++ >= start)
 				{
-					if (count > 0)
-						Write(", ");
-					WriteValue(obj);
-					if ( ++count >= max )
-						break;
+                    if (++count > max)
+                        break;
+                    Write(count == 1 ? "< " : ", ");
+                    WriteValue(obj);
 				}
 			}
 
-			if ( index < collection.Count )
+            if (count == 0)
+            {
+                Write(Fmt_EmptyCollection);
+                return;
+            }
+
+            if (count > max)
 				Write("...");
 
 			Write(" >");
@@ -435,6 +433,8 @@ namespace NUnit.Framework
             {
                 WriteConnector("+/-");
                 WriteExpectedValue(tolerance.Value);
+                if (tolerance.Mode != ToleranceMode.Linear)
+                    Write(" {0}", tolerance.Mode);
             }
 
 			WriteLine();
diff --git a/src/NUnitFramework/framework/Throws.cs b/src/NUnitFramework/framework/Throws.cs
index 42dca27..73feed8 100644
--- a/src/NUnitFramework/framework/Throws.cs
+++ b/src/NUnitFramework/framework/Throws.cs
@@ -4,14 +4,6 @@
 // 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;
@@ -25,7 +17,7 @@ namespace NUnit.Framework
     public class Throws
     {
         #region Exception
-        
+
         /// <summary>
         /// Creates a constraint specifying an expected exception
         /// </summary>
@@ -33,11 +25,11 @@ namespace NUnit.Framework
         {
             get { return new ConstraintExpression().Append(new ThrowsOperator()); }
         }
-        
+
         #endregion
-        
+
         #region InnerException
-        
+
         /// <summary>
         /// Creates a constraint specifying an exception with a given InnerException
         /// </summary>
@@ -45,11 +37,11 @@ namespace NUnit.Framework
         {
             get { return Exception.InnerException; }
         }
-        
+
         #endregion
-        
+
         #region TargetInvocationException
-        
+
         /// <summary>
         /// Creates a constraint specifying an expected TargetInvocationException
         /// </summary>
@@ -57,11 +49,11 @@ namespace NUnit.Framework
         {
             get { return TypeOf(typeof(System.Reflection.TargetInvocationException)); }
         }
-        
+
         #endregion
-        
+
         #region ArgumentException
-        
+
         /// <summary>
         /// Creates a constraint specifying an expected TargetInvocationException
         /// </summary>
@@ -69,11 +61,11 @@ namespace NUnit.Framework
         {
             get { return TypeOf(typeof(System.ArgumentException)); }
         }
-        
+
         #endregion
-        
+
         #region InvalidOperationException
-        
+
         /// <summary>
         /// Creates a constraint specifying an expected TargetInvocationException
         /// </summary>
@@ -81,11 +73,11 @@ namespace NUnit.Framework
         {
             get { return TypeOf(typeof(System.InvalidOperationException)); }
         }
-        
+
         #endregion
-        
+
         #region Nothing
-        
+
         /// <summary>
         /// Creates a constraint specifying that no exception is thrown
         /// </summary>
@@ -93,11 +85,11 @@ namespace NUnit.Framework
         {
             get { return new ThrowsNothingConstraint(); }
         }
-        
+
         #endregion
-        
+
         #region TypeOf
-        
+
         /// <summary>
         /// Creates a constraint specifying the exact type of exception expected
         /// </summary>
@@ -105,8 +97,8 @@ namespace NUnit.Framework
         {
             return Exception.TypeOf(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Creates a constraint specifying the exact type of exception expected
         /// </summary>
@@ -114,12 +106,12 @@ namespace NUnit.Framework
         {
             return TypeOf(typeof(T));
         }
-        
 #endif
+
         #endregion
-        
+
         #region InstanceOf
-        
+
         /// <summary>
         /// Creates a constraint specifying the type of exception expected
         /// </summary>
@@ -127,8 +119,8 @@ namespace NUnit.Framework
         {
             return Exception.InstanceOf(expectedType);
         }
-        
-#if NET_2_0
+
+#if CLR_2_0 || CLR_4_0
         /// <summary>
         /// Creates a constraint specifying the type of exception expected
         /// </summary>
@@ -136,9 +128,9 @@ namespace NUnit.Framework
         {
             return InstanceOf(typeof(T));
         }
-        
 #endif
+
         #endregion
-        
+
     }
 }
diff --git a/src/NUnitFramework/framework/nunit.framework.build b/src/NUnitFramework/framework/nunit.framework.build
index 49c7d95..62b9599 100644
--- a/src/NUnitFramework/framework/nunit.framework.build
+++ b/src/NUnitFramework/framework/nunit.framework.build
@@ -22,6 +22,7 @@
         <include name="Attributes/SetUpFixtureAttribute.cs"/>
         <include name="Attributes/SuiteAttribute.cs"/>
         <include name="Attributes/TearDownAttribute.cs"/>
+        <include name="Attributes/TestActionAttribute.cs"/>
         <include name="Attributes/TestAttribute.cs"/>
         <include name="Attributes/TestCaseAttribute.cs"/>
         <include name="Attributes/TestCaseSourceAttribute.cs"/>
@@ -52,8 +53,12 @@
         <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/GreaterThanConstraint.cs"/>
+    <include name="Constraints/GreaterThanOrEqualConstraint.cs"/>
+    <include name="Constraints/IResolveConstraint.cs"/>
+    <include name="Constraints/LessThanConstraint.cs"/>
+    <include name="Constraints/LessThanOrEqualConstraint.cs"/>
+    <include name="Constraints/MessageWriter.cs"/>
         <include name="Constraints/MsgUtils.cs"/>
         <include name="Constraints/Numerics.cs"/>
         <include name="Constraints/NUnitComparer.cs"/>
@@ -75,6 +80,9 @@
         <include name="Exceptions/IgnoreException.cs"/>
         <include name="Exceptions/InconclusiveException.cs"/>
         <include name="Exceptions/SuccessException.cs"/>
+        <include name="Interfaces/INUnitEqualityComparer.cs"/>
+        <include name="Interfaces/ITestAction.cs" />
+        <include name="ActionTargets.cs" />
         <include name="AssemblyInfo.cs"/>
         <include name="Assert.cs"/>
         <include name="AssertionHelper.cs"/>
@@ -96,6 +104,7 @@
         <include name="StringAssert.cs"/>
         <include name="TestCaseData.cs"/>
         <include name="TestContext.cs"/>
+        <include name="TestDetails.cs"/>
         <include name="TestState.cs"/>
         <include name="TestStatus.cs"/>
         <include name="Text.cs"/>
diff --git a/src/NUnitFramework/framework/nunit.framework.dll.csproj b/src/NUnitFramework/framework/nunit.framework.dll.csproj
index 2432274..1288a38 100644
--- a/src/NUnitFramework/framework/nunit.framework.dll.csproj
+++ b/src/NUnitFramework/framework/nunit.framework.dll.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -29,8 +29,8 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
-    <DocumentationFile>..\..\bin\Debug\framework\nunit.framework.xml</DocumentationFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0</DefineConstants>
+    <DocumentationFile>..\..\..\bin\Debug\framework\nunit.framework.xml</DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
     <FileAlignment>4096</FileAlignment>
     <NoWarn>1699</NoWarn>
@@ -46,8 +46,8 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
-    <DocumentationFile>..\..\bin\Release\framework\nunit.framework.xml</DocumentationFile>
+    <DefineConstants>TRACE;CLR_2_0</DefineConstants>
+    <DocumentationFile>..\..\..\bin\Release\framework\nunit.framework.xml</DocumentationFile>
     <FileAlignment>4096</FileAlignment>
     <NoWarn>1699</NoWarn>
     <Optimize>true</Optimize>
@@ -76,6 +76,7 @@
     <Compile Include="Assert.cs" />
     <Compile Include="AssertionHelper.cs" />
     <Compile Include="Assume.cs" />
+    <Compile Include="ActionTargets.cs" />
     <Compile Include="Attributes\CategoryAttribute.cs" />
     <Compile Include="Attributes\DatapointAttributes.cs" />
     <Compile Include="Attributes\DescriptionAttribute.cs" />
@@ -96,6 +97,7 @@
     <Compile Include="Attributes\SetUpFixtureAttribute.cs" />
     <Compile Include="Attributes\SuiteAttribute.cs" />
     <Compile Include="Attributes\TearDownAttribute.cs" />
+    <Compile Include="Attributes\TestActionAttribute.cs" />
     <Compile Include="Attributes\TestAttribute.cs" />
     <Compile Include="Attributes\TestCaseAttribute.cs" />
     <Compile Include="Attributes\TestCaseSourceAttribute.cs" />
@@ -127,7 +129,11 @@
     <Compile Include="Constraints\EqualConstraint.cs" />
     <Compile Include="Constraints\EqualityAdapter.cs" />
     <Compile Include="Constraints\FloatingPointNumerics.cs" />
+    <Compile Include="Constraints\GreaterThanConstraint.cs" />
+    <Compile Include="Constraints\GreaterThanOrEqualConstraint.cs" />
     <Compile Include="Constraints\IResolveConstraint.cs" />
+    <Compile Include="Constraints\LessThanConstraint.cs" />
+    <Compile Include="Constraints\LessThanOrEqualConstraint.cs" />
     <Compile Include="Constraints\MessageWriter.cs" />
     <Compile Include="Constraints\MsgUtils.cs" />
     <Compile Include="Constraints\Numerics.cs" />
@@ -155,7 +161,10 @@
     <Compile Include="FileAssert.cs" />
     <Compile Include="GlobalSettings.cs" />
     <Compile Include="Has.cs" />
+    <Compile Include="Interfaces\INUnitEqualityComparer.cs" />
+    <Compile Include="Interfaces\ITestAction.cs" />
     <Compile Include="IExpectException.cs" />
+    <Compile Include="TestDetails.cs" />
     <Compile Include="Is.cs" />
     <Compile Include="ITestCaseData.cs" />
     <Compile Include="Iz.cs" />
@@ -173,9 +182,6 @@
     <Compile Include="Throws.cs" />
   </ItemGroup>
   <ItemGroup>
-    <Content Include="SyntaxElements.txt" />
-  </ItemGroup>
-  <ItemGroup>
     <None Include="nunit.framework.build" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
diff --git a/src/NUnitFramework/tests/AssertThrowsTests.cs b/src/NUnitFramework/tests/AssertThrowsTests.cs
index 7810213..786ed99 100644
--- a/src/NUnitFramework/tests/AssertThrowsTests.cs
+++ b/src/NUnitFramework/tests/AssertThrowsTests.cs
@@ -17,7 +17,7 @@ namespace NUnit.Framework.Tests
             Exception ex = Assert.Catch(new TestDelegate(TestDelegates.ThrowsArgumentException));
             Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             ex = Assert.Catch(TestDelegates.ThrowsArgumentException);
             Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
 #endif
@@ -29,7 +29,7 @@ namespace NUnit.Framework.Tests
             Exception ex = Assert.Catch(typeof(ArgumentException), new TestDelegate(TestDelegates.ThrowsArgumentException));
             Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             ex = Assert.Catch<ArgumentException>(new TestDelegate(TestDelegates.ThrowsArgumentException));
             Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
 #endif
@@ -41,7 +41,7 @@ namespace NUnit.Framework.Tests
             Exception ex = Assert.Catch(typeof(ApplicationException), new TestDelegate(TestDelegates.ThrowsDerivedApplicationException));
             Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             ex = Assert.Catch<ApplicationException>(TestDelegates.ThrowsDerivedApplicationException);
             Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
 #endif
@@ -49,8 +49,8 @@ namespace NUnit.Framework.Tests
 
         [Test]
 		public void CorrectExceptionThrown()
-		{
-#if NET_2_0
+        {
+#if CLR_2_0 || CLR_4_0
             Assert.Throws(typeof(ArgumentException), TestDelegates.ThrowsArgumentException);
             Assert.Throws(typeof(ArgumentException),
                 delegate { throw new ArgumentException(); });
@@ -80,7 +80,7 @@ namespace NUnit.Framework.Tests
             Assert.That(ex.Message, StartsWith("myMessage"));
             Assert.That(ex.ParamName, Is.EqualTo("myParam"));
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             ex = Assert.Throws<ArgumentException>(
                 delegate { throw new ArgumentException("myMessage", "myParam"); }) as ArgumentException;
 
@@ -109,7 +109,7 @@ namespace NUnit.Framework.Tests
 			expectedMessage =
 				"  Expected: <System.ArgumentException>" + Environment.NewLine +
 				"  But was:  null" + Environment.NewLine;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.Throws<ArgumentException>(TestDelegates.ThrowsNothing);
 #else
 			Assert.Throws( typeof(ArgumentException),
@@ -122,8 +122,10 @@ namespace NUnit.Framework.Tests
         {
             expectedMessage =
                 "  Expected: <System.ArgumentException>" + Environment.NewLine +
-                "  But was:  <System.ApplicationException>" + Environment.NewLine;
-#if NET_2_0
+                "  But was:  <System.ApplicationException> (my message)" + Environment.NewLine;
+            matchType = MessageMatch.StartsWith;
+
+#if CLR_2_0 || CLR_4_0
             Assert.Throws<ArgumentException>(TestDelegates.ThrowsApplicationException);
 #else
 			Assert.Throws( typeof(ArgumentException),
@@ -136,8 +138,10 @@ namespace NUnit.Framework.Tests
         {
             expectedMessage =
                 "  Expected: <System.ArgumentException>" + Environment.NewLine +
-                "  But was:  <System.Exception>" + Environment.NewLine;
-#if NET_2_0
+                "  But was:  <System.Exception> (my message)" + Environment.NewLine;
+            matchType = MessageMatch.StartsWith;
+
+#if CLR_2_0 || CLR_4_0
             Assert.Throws<ArgumentException>(TestDelegates.ThrowsSystemException);
 #else
             Assert.Throws( typeof(ArgumentException),
@@ -150,8 +154,11 @@ namespace NUnit.Framework.Tests
         {
             expectedMessage =
                 "  Expected: <System.Exception>" + Environment.NewLine +
-                "  But was:  <System.ArgumentException>" + Environment.NewLine;
-#if NET_2_0
+                "  But was:  <System.ArgumentException> (myMessage" + Environment.NewLine +
+                "Parameter name: myParam)" + Environment.NewLine;
+            matchType = MessageMatch.StartsWith;
+
+#if CLR_2_0 || CLR_4_0
             Assert.Throws<Exception>(TestDelegates.ThrowsArgumentException);
 #else
             Assert.Throws( typeof(Exception),
@@ -162,7 +169,7 @@ namespace NUnit.Framework.Tests
         [Test]
         public void DoesNotThrowSuceeds()
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.DoesNotThrow(TestDelegates.ThrowsNothing);
 #else
             Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsNothing ) );
@@ -174,7 +181,7 @@ namespace NUnit.Framework.Tests
         [Test, ExpectedException(typeof(AssertionException))]
         public void DoesNotThrowFails()
         {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.DoesNotThrow(TestDelegates.ThrowsArgumentException);
 #else
             Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsArgumentException ) );
diff --git a/src/NUnitFramework/tests/CollectionAssertTest.cs b/src/NUnitFramework/tests/CollectionAssertTest.cs
index ea0c4c1..234a6fb 100644
--- a/src/NUnitFramework/tests/CollectionAssertTest.cs
+++ b/src/NUnitFramework/tests/CollectionAssertTest.cs
@@ -6,7 +6,9 @@
 
 using System;
 using System.Collections;
-using System.Data;
+#if NET_3_5 || NET_4_0
+using System.Linq;
+#endif
 
 namespace NUnit.Framework.Tests
 {
@@ -166,6 +168,7 @@ namespace NUnit.Framework.Tests
                 "  Expected: \"z\"" + Environment.NewLine +
                 "  But was:  \"a\"" + Environment.NewLine +
                 "  -----------^" + Environment.NewLine;
+
 			CollectionAssert.AreEqual(set1,set2,new TestComparer());
 		}
 
@@ -193,9 +196,9 @@ namespace NUnit.Framework.Tests
 			array2[1] = -99;
 
 			CollectionAssert.AreEqual(array1, array2, new AlwaysEqualComparer());
-		}
+        }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void AreEqual_UsingIterator()
         {
@@ -210,12 +213,44 @@ namespace NUnit.Framework.Tests
             yield return 2;
             yield return 3;
         }
+
+        [Test]
+        public void AreEqual_UsingIterator_Fails()
+        {
+            int[] array = new int[] { 1, 3, 5 };
+
+			Assert.That(
+            	delegate { CollectionAssert.AreEqual(array, CountToThree()); },
+			    Throws.TypeOf<AssertionException>()
+					.With.Message.EndsWith("Expected: 3" + Environment.NewLine + "  But was:  2" + Environment.NewLine));
+        }
 #endif
-		#endregion
 
-		#region AreEquivalent
+#if NET_3_5 || CLR_4_0
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0,Mono-4.0")]
+        public void AreEqual_UsingLinqQuery()
+        {
+            int[] array = new int[] { 1, 2, 3 };
+
+            CollectionAssert.AreEqual(array, array.Select((item) => item));
+        }
 
-		[Test]
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0,Mono-4.0")]
+        public void AreEqual_UsingLinqQuery_Fails()
+        {
+            int[] array = new int[] { 1, 2, 3 };
+
+			Assert.That(
+				delegate { CollectionAssert.AreEqual(array, array.Select((item) => item * 2)); },
+				Throws.TypeOf<AssertionException>()
+					.With.Message.EndsWith("Expected: 1" + Environment.NewLine + "  But was:  2" + Environment.NewLine));
+        }
+#endif
+        #endregion
+
+        #region AreEquivalent
+
+        [Test]
 		public void Equivalent()
 		{
 			ICollection set1 = new ICollectionAdapter( "x", "y", "z" );
diff --git a/src/NUnitFramework/tests/ConditionAssertTests.cs b/src/NUnitFramework/tests/ConditionAssertTests.cs
index 7cd18d0..fb646b8 100644
--- a/src/NUnitFramework/tests/ConditionAssertTests.cs
+++ b/src/NUnitFramework/tests/ConditionAssertTests.cs
@@ -103,6 +103,7 @@ namespace NUnit.Framework.Tests
 			Assert.IsEmpty( new int[0], "Failed on empty Array" );
 			Assert.IsEmpty( new ArrayList(), "Failed on empty ArrayList" );
 			Assert.IsEmpty( new Hashtable(), "Failed on empty Hashtable" );
+            Assert.IsEmpty( (IEnumerable)new int[0], "Failed on empty IEnumerable");
 		}
 
 		[Test, ExpectedException(typeof(AssertionException))]
@@ -123,16 +124,25 @@ namespace NUnit.Framework.Tests
 			Assert.IsEmpty( (string)null );
 		}
 
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void IsEmptyFailsOnNonEmptyArray()
-		{
-			expectedMessage =
-				"  Expected: <empty>" + Environment.NewLine +
-				"  But was:  < 1, 2, 3 >" + Environment.NewLine;
-			Assert.IsEmpty( new int[] { 1, 2, 3 } );
-		}
-
-		[Test]
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsEmptyFailsOnNonEmptyArray()
+        {
+            expectedMessage =
+                "  Expected: <empty>" + Environment.NewLine +
+                "  But was:  < 1, 2, 3 >" + Environment.NewLine;
+            Assert.IsEmpty(new int[] { 1, 2, 3 });
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsEmptyFailsOnNonEmptyIEnumerable()
+        {
+            expectedMessage =
+                "  Expected: <empty>" + Environment.NewLine +
+                "  But was:  < 1, 2, 3 >" + Environment.NewLine;
+            Assert.IsEmpty((IEnumerable)new int[] { 1, 2, 3 });
+        }
+
+        [Test]
 		public void IsNotEmpty()
 		{
 			int[] array = new int[] { 1, 2, 3 };
@@ -144,6 +154,7 @@ namespace NUnit.Framework.Tests
 			Assert.IsNotEmpty( array, "Failed on Array" );
 			Assert.IsNotEmpty( list, "Failed on ArrayList" );
 			Assert.IsNotEmpty( hash, "Failed on Hashtable" );
+            Assert.IsNotEmpty((IEnumerable)array, "Failed on IEnumerable");
 		}
 
 		[Test, ExpectedException(typeof(AssertionException))]
@@ -173,13 +184,22 @@ namespace NUnit.Framework.Tests
 			Assert.IsNotEmpty( new ArrayList() );
 		}
 
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void IsNotEmptyFailsOnEmptyHashTable()
-		{
-			expectedMessage =
-				"  Expected: not <empty>" + Environment.NewLine +
-				"  But was:  <empty>" + Environment.NewLine;
-			Assert.IsNotEmpty( new Hashtable() );
-		}
-	}
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotEmptyFailsOnEmptyHashTable()
+        {
+            expectedMessage =
+                "  Expected: not <empty>" + Environment.NewLine +
+                "  But was:  <empty>" + Environment.NewLine;
+            Assert.IsNotEmpty(new Hashtable());
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotEmptyFailsOnEmptyIEnumerable()
+        {
+            expectedMessage =
+                "  Expected: not <empty>" + Environment.NewLine +
+                "  But was:  <empty>" + Environment.NewLine;
+            Assert.IsNotEmpty((IEnumerable)new int[0]);
+        }
+    }
 }
diff --git a/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs b/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs
index b5c5f8f..166773f 100644
--- a/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs
@@ -14,6 +14,8 @@ namespace NUnit.Framework.Constraints
 	{
 		private static bool value;
 
+        //public AfterConstraintTest(int x) { }
+
 		[SetUp]
 		public void SetUp()
 		{
@@ -73,6 +75,67 @@ namespace NUnit.Framework.Constraints
             Assert.That(DelegateReturningZero, new DelayedConstraint(new EqualConstraint(0), -1));
         }
 
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void CanTestContentsOfList()
+        {
+            var worker = new System.ComponentModel.BackgroundWorker();
+            var list = new System.Collections.Generic.List<int>();
+            worker.RunWorkerCompleted += delegate { list.Add(1); };
+            worker.DoWork += delegate { Thread.Sleep(1); };
+            worker.RunWorkerAsync();
+            Assert.That(list, Has.Count.EqualTo(1).After(5000, 100));
+        }
+
+        [Test]
+        public void CanTestContentsOfRefList()
+        {
+            var worker = new System.ComponentModel.BackgroundWorker();
+            var list = new System.Collections.Generic.List<int>();
+            worker.RunWorkerCompleted += delegate { list.Add(1); };
+            worker.DoWork += delegate { Thread.Sleep(1); };
+            worker.RunWorkerAsync();
+            Assert.That(ref list, Has.Count.EqualTo(1).After(5000, 100));
+        }
+
+        [Test]
+        public void CanTestContentsOfDelegateReturningList()
+        {
+            var worker = new System.ComponentModel.BackgroundWorker();
+            var list = new System.Collections.Generic.List<int>();
+            worker.RunWorkerCompleted += delegate { list.Add(1); };
+            worker.DoWork += delegate { Thread.Sleep(1); };
+            worker.RunWorkerAsync();
+            Assert.That(() => list, Has.Count.EqualTo(1).After(5000, 100));
+        }
+
+        [Test]
+        public void CanTestInitiallyNullReference()
+        {
+            string statusString = null; // object starts off as null
+
+            var worker = new System.ComponentModel.BackgroundWorker();
+            worker.RunWorkerCompleted += delegate { statusString = "finished"; /* object non-null after work */ };
+            worker.DoWork += delegate { Thread.Sleep(TimeSpan.FromSeconds(1)); /* simulate work */ };
+            worker.RunWorkerAsync();
+
+            Assert.That(ref statusString, Has.Length.GreaterThan(0).After(3000, 100));
+        }
+
+        [Test]
+        public void CanTestInitiallyNullDelegate()
+        {
+            string statusString = null; // object starts off as null
+
+            var worker = new System.ComponentModel.BackgroundWorker();
+            worker.RunWorkerCompleted += delegate { statusString = "finished"; /* object non-null after work */ };
+            worker.DoWork += delegate { Thread.Sleep(TimeSpan.FromSeconds(1)); /* simulate work */ };
+            worker.RunWorkerAsync();
+
+            Assert.That(() => statusString, Has.Length.GreaterThan(0).After(3000, 100));
+        }
+#endif
+
         private static int setValueTrueDelay;
 
 		private void SetValueTrueAfterDelay(int delay)
diff --git a/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs b/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
index d9c3ae3..4ac453c 100644
--- a/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
@@ -6,10 +6,12 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+using NUnit.Framework.Tests;
+
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
+using RangeConstraint = NUnit.Framework.Constraints.RangeConstraint<int>;
 #endif
-using NUnit.Framework.Tests;
 
 namespace NUnit.Framework.Constraints
 {
@@ -48,7 +50,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void AllItemsAreInRange_UsingIComparerOfT()
         {
@@ -93,6 +95,61 @@ namespace NUnit.Framework.Constraints
     }
     #endregion
 
+    #region OneItem
+    public class ExactCountConstraintTests : MessageChecker
+    {
+        private static readonly string[] names = new string[] { "Charlie", "Fred", "Joe", "Charlie" };
+
+        [Test]
+        public void ZeroItemsMatch()
+        {
+            Assert.That(names, new ExactCountConstraint(0, Is.EqualTo("Sam")));
+            Assert.That(names, Has.Exactly(0).EqualTo("Sam"));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ZeroItemsMatchFails()
+        {
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "no item \"Charlie\"" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "< \"Charlie\", \"Fred\", \"Joe\", \"Charlie\" >" + Environment.NewLine;
+            Assert.That(names, new ExactCountConstraint(0, Is.EqualTo("Charlie")));
+        }
+
+        [Test]
+        public void ExactlyOneItemMatches()
+        {
+            Assert.That(names, new ExactCountConstraint(1, Is.EqualTo("Fred")));
+            Assert.That(names, Has.Exactly(1).EqualTo("Fred"));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ExactlyOneItemMatchFails()
+        {
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "exactly one item \"Charlie\"" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "< \"Charlie\", \"Fred\", \"Joe\", \"Charlie\" >" + Environment.NewLine;
+            Assert.That(names, new ExactCountConstraint(1, Is.EqualTo("Charlie")));
+        }
+
+        [Test]
+        public void ExactlyTwoItemsMatch()
+        {
+            Assert.That(names, new ExactCountConstraint(2, Is.EqualTo("Charlie")));
+            Assert.That(names, Has.Exactly(2).EqualTo("Charlie"));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ExactlyTwoItemsMatchFails()
+        {
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "exactly 2 items \"Fred\"" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "< \"Charlie\", \"Fred\", \"Joe\", \"Charlie\" >" + Environment.NewLine;
+            Assert.That(names, new ExactCountConstraint(2, Is.EqualTo("Fred")));
+        }
+    }
+    #endregion
+
     #region CollectionContains
     [TestFixture]
     public class CollectionContainsTests
@@ -159,7 +216,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if NET_2_0	
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void UsesProvidedEqualityComparer()
         {
@@ -250,7 +307,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if CS_3_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void UsesProvidedLambdaExpression()
         {
@@ -337,7 +394,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(new CollectionEquivalentConstraint(set1).IgnoreCase.Matches(set2));
         }
 
-#if CS_3_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void EquivalentHonorsUsing()
         {
@@ -348,6 +405,52 @@ namespace NUnit.Framework.Constraints
                 .Using<string>( (x,y)=>String.Compare(x,y,true) )
                 .Matches(set2));
         }
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0,Mono-4.0")]
+        public void WorksWithHashSets()
+        {
+            var hash1 = new HashSet<string>(new string[] { "presto", "abracadabra", "hocuspocus" });
+            var hash2 = new HashSet<string>(new string[] { "abracadabra", "presto", "hocuspocus" });
+
+            Assert.That(new CollectionEquivalentConstraint(hash1).Matches(hash2));
+        }
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0,Mono-4.0")]
+        public void WorksWithHashSetAndArray()
+        {
+            var hash = new HashSet<string>(new string[] { "presto", "abracadabra", "hocuspocus" });
+            var array = new string[] { "abracadabra", "presto", "hocuspocus" };
+
+            var constraint = new CollectionEquivalentConstraint(hash);
+            Assert.That(constraint.Matches(array));
+        }
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0,Mono-4.0")]
+        public void WorksWithArrayAndHashSet()
+        {
+            var hash = new HashSet<string>(new string[] { "presto", "abracadabra", "hocuspocus" });
+            var array = new string[] { "abracadabra", "presto", "hocuspocus" };
+
+            var constraint = new CollectionEquivalentConstraint(array);
+            Assert.That(constraint.Matches(hash));
+        }
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0,Mono-4.0")]
+        public void FailureMessageWithHashSetAndArray()
+        {
+            var hash = new HashSet<string>(new string[] { "presto", "abracadabra", "hocuspocus" });
+            var array = new string[] { "abracadabra", "presto", "hocusfocus" };
+
+            var constraint = new CollectionEquivalentConstraint(hash);
+            Assert.False(constraint.Matches(array));
+
+            TextMessageWriter writer = new TextMessageWriter();
+            constraint.WriteMessageTo(writer);
+            Assert.That(writer.ToString(), Is.EqualTo(
+                "  Expected: equivalent to < \"presto\", \"abracadabra\", \"hocuspocus\" >" + Environment.NewLine +
+                "  But was:  < \"abracadabra\", \"presto\", \"hocusfocus\" >" + Environment.NewLine));
+            Console.WriteLine(writer.ToString());
+        }
 #endif
     }
     #endregion
@@ -482,7 +585,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(comparer.Called, "TestComparer was not called");
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void UsesProvidedComparerOfT()
         {
@@ -529,7 +632,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if CS_3_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void UsesProvidedLambda()
         {
diff --git a/src/NUnitFramework/tests/Constraints/ComparerTests.cs b/src/NUnitFramework/tests/Constraints/ComparerTests.cs
index 57dcb73..feb6b50 100644
--- a/src/NUnitFramework/tests/Constraints/ComparerTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ComparerTests.cs
@@ -11,6 +11,14 @@ namespace NUnit.Framework.Constraints
     [TestFixture]
     public class ComparerTests
     {
+        private Tolerance tolerance;
+
+        [SetUp]
+        public void Setup()
+        {
+            tolerance = Tolerance.Empty;
+        }
+
         [TestCase(4, 4)]
         [TestCase(4.0d, 4.0d)]
         [TestCase(4.0f, 4.0f)]
@@ -21,13 +29,13 @@ namespace NUnit.Framework.Constraints
         [TestCase(4.0f, 4)]
         [TestCase(4.0f, 4.0d)]
         [TestCase(SpecialValue.Null, SpecialValue.Null)]
-#if NET_2_0
+#if CLR_2_0 || CLR_4_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));
+            Assert.That(NUnitEqualityComparer.Default.AreEqual(x, y, ref tolerance));
         }
 
         [TestCase(4, 2)]
@@ -40,15 +48,15 @@ namespace NUnit.Framework.Constraints
         [TestCase(4.0f, 2)]
         [TestCase(4.0f, 2.0d)]
         [TestCase(4, SpecialValue.Null)]
-#if NET_2_0
+#if CLR_2_0 || CLR_4_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 ));
+            Assert.False(NUnitEqualityComparer.Default.AreEqual(greater, lesser, ref tolerance));
+            Assert.False(NUnitEqualityComparer.Default.AreEqual(lesser, greater, ref tolerance));
         }
 
         [TestCase(double.PositiveInfinity)]
@@ -59,7 +67,7 @@ namespace NUnit.Framework.Constraints
         [TestCase(float.NaN)]
         public void SpecialFloatingPointValues(object x)
         {
-            Assert.That(NUnitEqualityComparer.Default.ObjectsEqual(x, x));
+            Assert.That(NUnitEqualityComparer.Default.AreEqual(x, x, ref tolerance));
         }
     }
 }
diff --git a/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
index ed4d9f0..1105c67 100644
--- a/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -36,7 +36,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void UsesProvidedComparerOfT()
         {
@@ -75,7 +75,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if CS_3_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void UsesProvidedLambda()
         {
@@ -115,7 +115,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(actual, Is.GreaterThan(expected));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void CanCompareIComparablesOfT()
         {
@@ -155,7 +155,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(actual, Is.GreaterThanOrEqualTo(expected));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void CanCompareIComparablesOfT()
         {
@@ -195,7 +195,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(actual, Is.LessThan(expected));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void CanCompareIComparablesOfT()
         {
@@ -235,7 +235,7 @@ namespace NUnit.Framework.Constraints
             Assert.That(actual, Is.LessThanOrEqualTo(expected));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void CanCompareIComparablesOfT()
         {
@@ -251,12 +251,20 @@ namespace NUnit.Framework.Constraints
     [TestFixture]
     public class RangeConstraintTest : ConstraintTestBaseWithArgumentException
     {
+#if CLR_2_0 || CLR_4_0
+        RangeConstraint<int> rangeConstraint;
+#else
         RangeConstraint rangeConstraint;
+#endif
 
         [SetUp]
         public void SetUp()
         {
+#if CLR_2_0 || CLR_4_0
+            theConstraint = rangeConstraint = new RangeConstraint<int>(5, 42);
+#else
             theConstraint = rangeConstraint = new RangeConstraint(5, 42);
+#endif
             expectedDescription = "in range (5,42)";
             stringRepresentation = "<range 5 42>";
         }
@@ -288,7 +296,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void UsesProvidedComparerOfT()
         {
@@ -327,7 +335,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if CS_3_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void UsesProvidedLambda()
         {
@@ -359,7 +367,7 @@ namespace NUnit.Framework.Constraints
         }
     }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     class ClassWithIComparableOfT : IComparable<ClassWithIComparableOfT>
     {
         private int val;
diff --git a/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs b/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
index fd84b4f..1cfc5dc 100644
--- a/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
+++ b/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
@@ -25,7 +25,7 @@ namespace NUnit.Framework.Constraints
             string.Empty,
             new object[0],
             new ArrayList(),
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             new System.Collections.Generic.List<int>()
 #endif  
         };
diff --git a/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs b/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs
new file mode 100644
index 0000000..4abde29
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs
@@ -0,0 +1,488 @@
+// ****************************************************************
+// Copyright 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 CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class EqualConstraintTests : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            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 || CS_4_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 CLR_2_0 || CLR_4_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), ExpectedMessage = "+/- 1 Ulps", MatchType = MessageMatch.Contains)]
+        [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), ExpectedMessage = "+/- 1 Ulps", MatchType = MessageMatch.Contains)]
+        [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), ExpectedMessage = "+/- 10.0d Percent", MatchType = MessageMatch.Contains)]
+        [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), ExpectedMessage = "+/- 10.0f Percent", MatchType = MessageMatch.Contains)]
+        [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 CLR_2_0 || CLR_4_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 || CS_4_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)));
+        }
+
+        [Test]
+        public void UsesProvidedListComparer()
+        {
+            var list1 = new List<int>() { 2, 3 };
+            var list2 = new List<int>() { 3, 4 };
+
+            var list11 = new List<List<int>>() { list1 };
+            var list22 = new List<List<int>>() { list2 };
+            var comparer = new IntListEqualComparer();
+
+            Assert.That(list11, new CollectionEquivalentConstraint(list22).Using(comparer));
+        }
+
+        public class IntListEqualComparer : IEqualityComparer<List<int>>
+        {
+            public bool Equals(List<int> x, List<int> y)
+            {
+                return x.Count == y.Count;
+            }
+
+            public int GetHashCode(List<int> obj)
+            {
+                return obj.Count.GetHashCode();
+            }
+        }
+
+        [Test]
+        public void UsesProvidedArrayComparer()
+        {
+            var array1 = new int[] { 2, 3 };
+            var array2 = new int[] { 3, 4 };
+
+            var list11 = new List<int[]>() { array1 };
+            var list22 = new List<int[]>() { array2 };
+            var comparer = new IntArrayEqualComparer();
+
+            Assert.That(list11, new CollectionEquivalentConstraint(list22).Using(comparer));
+        }
+
+        public class IntArrayEqualComparer : IEqualityComparer<int[]>
+        {
+            public bool Equals(int[] x, int[] y)
+            {
+                return x.Length == y.Length;
+            }
+
+            public int GetHashCode(int[] obj)
+            {
+                return obj.Length.GetHashCode();
+            }
+        }
+#endif
+#endif
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/EqualTest.cs b/src/NUnitFramework/tests/Constraints/EqualTest.cs
index 44f928a..a2e14c4 100644
--- a/src/NUnitFramework/tests/Constraints/EqualTest.cs
+++ b/src/NUnitFramework/tests/Constraints/EqualTest.cs
@@ -7,435 +7,10 @@
 using System;
 using System.IO;
 using System.Drawing;
-using System.Collections;
-#if NET_2_0
-using System.Collections.Generic;
-#endif
 
 namespace NUnit.Framework.Constraints
 {
     [TestFixture]
-    public class EqualConstraintTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            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
     {
 
@@ -532,7 +107,7 @@ namespace NUnit.Framework.Constraints
             }
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void TestPropertyWithPrivateSetter()
         {
@@ -550,17 +125,4 @@ namespace NUnit.Framework.Constraints
         }
 #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/MsgUtilTests.cs b/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
index c2ca2b5..6c5b462 100644
--- a/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
+++ b/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
@@ -22,8 +22,8 @@ namespace NUnit.Framework.Constraints
         [TestCase("\n\r", "\\n\\r")]
         [TestCase("This is a\rtest message", "This is a\\rtest message")]
         [TestCase("", "")]
-#if NET_2_0
-		[TestCase(null, null)]
+#if CLR_2_0 || CLR_4_0
+        [TestCase(null, null)]
 #endif
         [TestCase("\t", "\\t")]
         [TestCase("\t\n", "\\t\\n")]
diff --git a/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs b/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs
new file mode 100644
index 0000000..132c40b
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs
@@ -0,0 +1,141 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class EqualityComparerTests
+    {
+        private Tolerance tolerance;
+        private NUnitEqualityComparer comparer;
+
+        [SetUp]
+        public void Setup()
+        {
+            tolerance = Tolerance.Zero;
+            comparer = new NUnitEqualityComparer();
+        }
+
+        [Test]
+        public void CanCompareArrayContainingSelfToSelf()
+        {
+            object[] array = new object[1];
+            array[0] = array;
+
+            Assert.True(comparer.AreEqual(array, array, ref tolerance));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void IEquatableSuccess()
+        {
+            IEquatableWithoutEqualsOverridden x = new IEquatableWithoutEqualsOverridden(1);
+            IEquatableWithoutEqualsOverridden y = new IEquatableWithoutEqualsOverridden(1);
+
+            Assert.IsTrue(comparer.AreEqual(x, y, ref tolerance));
+        }
+
+        [Test]
+        public void IEquatableDifferentTypesSuccess_WhenActualImplementsIEquatable()
+        {
+            int x = 1;
+            Int32IEquatable y = new Int32IEquatable(1);
+
+            // y.Equals(x) is what gets actually called
+            // TODO: This should work both ways
+            Assert.IsTrue(comparer.AreEqual(x, y, ref tolerance));
+        }
+
+        [Test]
+        public void IEquatableDifferentTypesSuccess_WhenExpectedImplementsIEquatable()
+        {
+            int x = 1;
+            Int32IEquatable y = new Int32IEquatable(1);
+
+            // y.Equals(x) is what gets actually called
+            // TODO: This should work both ways
+            Assert.IsTrue(comparer.AreEqual(y, x, ref tolerance));
+        }
+
+        [Test]
+        public void ReferenceEqualityHasPrecedenceOverIEquatable()
+        {
+            NeverEqualIEquatable z = new NeverEqualIEquatable();
+
+            Assert.IsTrue(comparer.AreEqual(z, z, ref tolerance));
+        }
+
+        [Test]
+        public void IEquatableHasPrecedenceOverDefaultEquals()
+        {
+            NeverEqualIEquatableWithOverriddenAlwaysTrueEquals x = new NeverEqualIEquatableWithOverriddenAlwaysTrueEquals();
+            NeverEqualIEquatableWithOverriddenAlwaysTrueEquals y = new NeverEqualIEquatableWithOverriddenAlwaysTrueEquals();
+
+            Assert.IsFalse(comparer.AreEqual(x, y, ref tolerance));
+        }
+#endif
+    }
+
+#if CLR_2_0 || CLR_4_0
+    public class NeverEqualIEquatableWithOverriddenAlwaysTrueEquals : IEquatable<NeverEqualIEquatableWithOverriddenAlwaysTrueEquals>
+    {
+        public bool Equals(NeverEqualIEquatableWithOverriddenAlwaysTrueEquals other)
+        {
+            return false;
+        }
+
+        public override bool Equals(object obj)
+        {
+            return true;
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+    }
+
+    public class Int32IEquatable : IEquatable<int>
+    {
+        private readonly int value;
+
+        public Int32IEquatable(int value)
+        {
+            this.value = value;
+        }
+
+        public bool Equals(int other)
+        {
+            return value.Equals(other);
+        }
+    }
+
+    public class NeverEqualIEquatable : IEquatable<NeverEqualIEquatable>
+    {
+        public bool Equals(NeverEqualIEquatable other)
+        {
+            return false;
+        }
+    }
+
+    public class IEquatableWithoutEqualsOverridden : IEquatable<IEquatableWithoutEqualsOverridden>
+    {
+        private readonly int value;
+
+        public IEquatableWithoutEqualsOverridden(int value)
+        {
+            this.value = value;
+        }
+
+        public bool Equals(IEquatableWithoutEqualsOverridden other)
+        {
+            return value.Equals(other.value);
+        }
+    }
+#endif
+}
diff --git a/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
index 53306c4..db87d69 100644
--- a/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
 {
diff --git a/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs b/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
index a4da77c..59f2ac9 100644
--- a/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
+++ b/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -45,8 +45,8 @@ namespace NUnit.Framework.Constraints
 
         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() };
+#if CLR_2_0 || CLR_4_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() };
diff --git a/src/NUnitFramework/tests/DirectoryAssertTests.cs b/src/NUnitFramework/tests/DirectoryAssertTests.cs
index 3867e35..56face9 100644
--- a/src/NUnitFramework/tests/DirectoryAssertTests.cs
+++ b/src/NUnitFramework/tests/DirectoryAssertTests.cs
@@ -19,13 +19,13 @@ namespace NUnit.Framework.Tests
 
         #region TestDirectory Utility Class
 
-        public TestDirectory(string directoryName) : this(directoryName, true) { }
+        public TestDirectory(string dirName) : this(dirName, true) { }
 
-        public TestDirectory(string directoryName, bool CreateSubDirectory)
+        public TestDirectory(string dirName, bool CreateSubDirectory)
         {
-            this.directoryName = Path.Combine(Environment.CurrentDirectory, directoryName);
+            this.directoryName = Path.Combine(Path.GetTempPath(), dirName);
 
-            directoryInformation = Directory.CreateDirectory(directoryName);
+            directoryInformation = Directory.CreateDirectory(this.directoryName);
 
             if (CreateSubDirectory)
             {
diff --git a/src/NUnitFramework/tests/EqualsFixture.cs b/src/NUnitFramework/tests/EqualsFixture.cs
index e4060eb..1cfbdd0 100644
--- a/src/NUnitFramework/tests/EqualsFixture.cs
+++ b/src/NUnitFramework/tests/EqualsFixture.cs
@@ -288,7 +288,7 @@ namespace NUnit.Framework.Tests
 			Assert.AreEqual( 35, i21  );
 			Assert.AreEqual( 35, i22  );
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             byte? b23 = 35;
             sbyte? sb24 = 35;
             decimal? d25 = 35;
@@ -537,6 +537,42 @@ namespace NUnit.Framework.Tests
 
             Assert.AreEqual(dir1, dir2);
         }
+
+#if CLR_2_0 || CLR_4_0
+		[Test]
+		public void IEquatableSuccess_OldSyntax()
+		{
+			IntEquatable a = new IntEquatable(1);
+
+			Assert.AreEqual(1, a);
+            Assert.AreEqual(a, 1);
+		}
+
+		[Test]
+		public void IEquatableSuccess_ConstraintSyntax()
+		{
+			IntEquatable a = new IntEquatable(1);
+
+			Assert.That(a, Is.EqualTo(1));
+            Assert.That(1, Is.EqualTo(a));
+		}
+#endif
     }
-}
 
+#if CLR_2_0 || CLR_4_0
+	public class IntEquatable : IEquatable<int>
+	{
+		private int i;
+
+		public IntEquatable(int i)
+		{
+			this.i = i;
+		}
+
+		public bool Equals(int other)
+		{
+			return i.Equals(other);
+		}
+	}
+#endif
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/FileAssertTests.cs b/src/NUnitFramework/tests/FileAssertTests.cs
index 718a2fa..2b12bc5 100644
--- a/src/NUnitFramework/tests/FileAssertTests.cs
+++ b/src/NUnitFramework/tests/FileAssertTests.cs
@@ -11,17 +11,17 @@ using System.Net.Sockets;
 
 namespace NUnit.Framework.Tests
 {
-	public class TestFile : IDisposable
+    #region Nested TestFile Utility Class
+    public class TestFile : IDisposable
 	{
 		private bool _disposedValue = false;
 		private string _resourceName;
 		private string _fileName;
 
-		#region Nested TestFile Utility Class
 		public TestFile(string fileName, string resourceName)
 		{
 			_resourceName = "NUnit.Framework.Tests.data." + resourceName;
-			_fileName = fileName;
+            _fileName = Path.Combine(Path.GetTempPath(), fileName);
 
 			Assembly a = Assembly.GetExecutingAssembly();
 			using (Stream s = a.GetManifestResourceStream(_resourceName))
@@ -41,6 +41,11 @@ namespace NUnit.Framework.Tests
 			}
 		}
 
+        public string FileName
+        {
+            get { return _fileName; }
+        }
+
 		protected virtual void Dispose(bool disposing)
 		{
 			if (!this._disposedValue)
@@ -66,10 +71,10 @@ namespace NUnit.Framework.Tests
 		}
 
 		#endregion
-	}
-	#endregion
+    }
+    #endregion
 
-	/// <summary>
+    /// <summary>
 	/// Summary description for FileAssertTests.
 	/// </summary>
 	[TestFixture]
@@ -99,9 +104,9 @@ namespace NUnit.Framework.Tests
             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 expected = File.OpenRead(tf1.FileName))
                 {
-                    using (FileStream actual = File.OpenRead("Test2.jpg"))
+                    using (FileStream actual = File.OpenRead(tf2.FileName))
                     {
                         FileAssert.AreEqual(expected, actual);
                     }
@@ -116,9 +121,9 @@ namespace NUnit.Framework.Tests
             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 expected = File.OpenRead(tf1.FileName))
                 {
-                    using (FileStream actual = File.OpenWrite("Test2.jpg"))
+                    using (FileStream actual = File.OpenWrite(tf2.FileName))
                     {
                         FileAssert.AreEqual(expected, actual);
                     }
@@ -132,7 +137,7 @@ namespace NUnit.Framework.Tests
         {
             using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
             {
-                using (FileStream expected = File.OpenRead("Test1.jpg"))
+                using (FileStream expected = File.OpenRead(tf1.FileName))
                 {
                     using (FakeStream actual = new FakeStream())
                     {
@@ -156,7 +161,7 @@ namespace NUnit.Framework.Tests
             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" );
+				FileAssert.AreEqual( tf1.FileName, tf2.FileName, "Failed using file names" );
 			}
 		}
 
@@ -165,7 +170,7 @@ namespace NUnit.Framework.Tests
 		{
             using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				FileAssert.AreEqual( "Test1.jpg", "Test1.jpg" );
+				FileAssert.AreEqual( tf1.FileName, tf1.FileName );
 			}
 		}
 
@@ -175,8 +180,8 @@ namespace NUnit.Framework.Tests
 			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" );
+				FileInfo expected = new FileInfo( tf1.FileName );
+				FileInfo actual = new FileInfo( tf2.FileName );
 				FileAssert.AreEqual( expected, actual );
 				FileAssert.AreEqual( expected, actual );
 			}
@@ -189,7 +194,7 @@ namespace NUnit.Framework.Tests
 			{
 				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
 				{
-					FileAssert.AreEqual( "Test1.txt", "Test2.txt" );
+					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
 				}
 			}
 		}
@@ -201,7 +206,7 @@ namespace NUnit.Framework.Tests
 		{
             using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				using(FileStream expected = File.OpenRead("Test1.jpg"))
+				using(FileStream expected = File.OpenRead(tf1.FileName))
 				{
 					expectedMessage = 
 						"  Expected: <System.IO.FileStream>" + Environment.NewLine +
@@ -220,14 +225,14 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile(actualFile, "TestImage2.jpg"))
 				{
-					using(FileStream expected = File.OpenRead(expectedFile))
+					using(FileStream expected = File.OpenRead(tf1.FileName))
 					{
-						using(FileStream actual = File.OpenRead(actualFile))
+						using(FileStream actual = File.OpenRead(tf2.FileName))
 						{
 							expectedMessage =
 								string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
-									new FileInfo(expectedFile).Length, new FileInfo(actualFile).Length);
-							FileAssert.AreEqual( expected, actual);
+									new FileInfo(tf1.FileName).Length, new FileInfo(tf2.FileName).Length);
+							FileAssert.AreEqual( tf1.FileName, tf2.FileName);
 						}
 					}
 				}
@@ -241,8 +246,8 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
-					FileInfo expected = new FileInfo( "Test1.jpg" );
-					FileInfo actual = new FileInfo( "Test2.jpg" );
+					FileInfo expected = new FileInfo( tf1.FileName );
+					FileInfo actual = new FileInfo( tf2.FileName );
 					expectedMessage =
 						string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
 							expected.Length, actual.Length);
@@ -263,8 +268,8 @@ namespace NUnit.Framework.Tests
 				{
 					expectedMessage =
 						string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
-							new FileInfo(expected).Length, new FileInfo(actual).Length);
-					FileAssert.AreEqual( expected, actual );
+							new FileInfo(tf1.FileName).Length, new FileInfo(tf2.FileName).Length);
+					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
 				}
 			}
 		}
@@ -279,7 +284,7 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
 				{
-					FileAssert.AreEqual( "Test1.txt", "Test2.txt" );
+					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
 				}
 			}
 		}
@@ -295,7 +300,7 @@ namespace NUnit.Framework.Tests
 		{
             using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
 			{
-				using(FileStream expected = File.OpenRead("Test1.jpg"))
+				using(FileStream expected = File.OpenRead(tf1.FileName))
 				{
 					FileAssert.AreNotEqual( expected, null );
 				}
@@ -309,9 +314,9 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
-					using(FileStream expected = File.OpenRead("Test1.jpg"))
+					using(FileStream expected = File.OpenRead(tf1.FileName))
 					{
-						using(FileStream actual = File.OpenRead("Test2.jpg"))
+						using(FileStream actual = File.OpenRead(tf2.FileName))
 						{
 							FileAssert.AreNotEqual( expected, actual);
 						}
@@ -327,7 +332,7 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
-					FileAssert.AreNotEqual( "Test1.jpg", "Test2.jpg" );
+					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
 				}
 			}
 		}
@@ -339,8 +344,8 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
 				{
-					FileInfo expected = new FileInfo( "Test1.jpg" );
-					FileInfo actual = new FileInfo( "Test2.jpg" );
+					FileInfo expected = new FileInfo( tf1.FileName );
+					FileInfo actual = new FileInfo( tf2.FileName );
 					FileAssert.AreNotEqual( expected, actual );
 				}
 			}
@@ -353,7 +358,7 @@ namespace NUnit.Framework.Tests
 			{
                 using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
 				{
-					FileAssert.AreNotEqual( "Test1.txt", "Test2.txt" );
+					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
 				}
 			}
 		}
@@ -376,8 +381,8 @@ namespace NUnit.Framework.Tests
 		{
 			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"))
+			using(FileStream expected = File.OpenRead(tf1.FileName))
+			using(FileStream actual = File.OpenRead(tf2.FileName))
 			{
 				expectedMessage = 
 					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
@@ -393,8 +398,8 @@ namespace NUnit.Framework.Tests
 			{
 				using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
 				{
-					FileInfo expected = new FileInfo( "Test1.jpg" );
-					FileInfo actual = new FileInfo( "Test2.jpg" );
+					FileInfo expected = new FileInfo( tf1.FileName );
+					FileInfo actual = new FileInfo( tf2.FileName );
 					expectedMessage = 
 						"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
 						"  But was:  <System.IO.FileStream>" + Environment.NewLine;
@@ -411,7 +416,7 @@ namespace NUnit.Framework.Tests
 				expectedMessage = 
 					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
 					"  But was:  <System.IO.FileStream>" + Environment.NewLine;
-				FileAssert.AreNotEqual( "Test1.jpg", "Test1.jpg" );
+				FileAssert.AreNotEqual( tf1.FileName, tf1.FileName );
 			}
 		}
 
@@ -425,7 +430,7 @@ namespace NUnit.Framework.Tests
 					expectedMessage = 
 						"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
 						"  But was:  <System.IO.FileStream>" + Environment.NewLine;
-					FileAssert.AreNotEqual( "Test1.txt", "Test2.txt" );
+					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
 				}
 			}
 		}
diff --git a/src/NUnitFramework/tests/MessageChecker.cs b/src/NUnitFramework/tests/MessageChecker.cs
index bb3fa84..d4c178f 100644
--- a/src/NUnitFramework/tests/MessageChecker.cs
+++ b/src/NUnitFramework/tests/MessageChecker.cs
@@ -16,6 +16,7 @@ namespace NUnit.Framework.Tests
 	public abstract class MessageChecker : AssertionHelper, IExpectException
 	{
 		protected string expectedMessage;
+        protected MessageMatch matchType = MessageMatch.Exact;
 
 		[SetUp]
 		public void SetUp()
@@ -26,7 +27,24 @@ namespace NUnit.Framework.Tests
 		public void HandleException( Exception ex )
 		{
 			if ( expectedMessage != null )
-				Assert.AreEqual( expectedMessage, ex.Message );
-		}
+            {
+                switch(matchType)
+                {
+                    default:
+                    case MessageMatch.Exact:
+				        Assert.AreEqual( expectedMessage, ex.Message );
+                        break;
+                    case MessageMatch.Contains:
+                        Assert.That(ex.Message, Is.StringContaining(expectedMessage));
+                        break;
+                    case MessageMatch.StartsWith:
+                        Assert.That(ex.Message, Is.StringStarting(expectedMessage));
+                        break;
+                    case MessageMatch.Regex:
+                        Assert.That(ex.Message, Is.StringMatching(expectedMessage));
+                        break;
+                }
+            }
+        }
 	}
 }
diff --git a/src/NUnitFramework/tests/NullableTypesTests.cs b/src/NUnitFramework/tests/NullableTypesTests.cs
index b61f4dc..d3b861e 100644
--- a/src/NUnitFramework/tests/NullableTypesTests.cs
+++ b/src/NUnitFramework/tests/NullableTypesTests.cs
@@ -7,7 +7,8 @@ using System;
 
 namespace NUnit.Framework.Tests
 {
-#if NET_2_0 && !MONO
+#if CLR_2_0 || CLR_4_0
+#if !MONO
     [TestFixture, Category("Generics")]
     public class NullableTypesTests
     {
@@ -23,6 +24,7 @@ namespace NUnit.Framework.Tests
             Assert.That(five, Is.Not.Null);
         }
 
+#if false
         [Test]
         public void CanCompareNullableInts()
         {
@@ -47,7 +49,7 @@ namespace NUnit.Framework.Tests
             //Assert.That(3, Is.LessThan(five));
             //Assert.That(5, Is.LessThanOrEqualTo(five));
         }
-
+		
         [Test]
         public void CanCompareNullableDoubles()
         {
@@ -72,6 +74,7 @@ namespace NUnit.Framework.Tests
             //Assert.That(3.0, Is.LessThan(five));
             //Assert.That(5.0, Is.LessThanOrEqualTo(five));
         }
+#endif
 
         [Test]
         public void CanTestForNaN()
@@ -81,6 +84,7 @@ namespace NUnit.Framework.Tests
             Assert.That(anNaN, Is.NaN);
         }
 
+#if false
         [Test]
         public void CanCompareNullableDecimals()
         {
@@ -105,7 +109,8 @@ namespace NUnit.Framework.Tests
             //Assert.That(3m, Is.LessThan(five));
             //Assert.That(5m, Is.LessThanOrEqualTo(five));
         }
-
+#endif
+		
         [Test]
         public void CanCompareWithTolerance()
         {
@@ -187,6 +192,7 @@ namespace NUnit.Framework.Tests
             Assert.That(int5, Is.EqualTo(5m));
             Assert.That(double5, Is.EqualTo(5m));
 
+#if false
             Assert.Greater(int5, 3.0);
             Assert.Greater(int5, 3m);
             Assert.Greater(double5, 3);
@@ -207,7 +213,7 @@ namespace NUnit.Framework.Tests
             Assert.Less(3m, double5);
             Assert.Less(3, decimal5);
             Assert.Less(3.0, decimal5);
-
+#endif
             //Assert.That(3.0, Is.LessThan(int5));
             //Assert.That(3m, Is.LessThan(int5));
             //Assert.That(3, Is.LessThan(double5));
@@ -243,4 +249,5 @@ namespace NUnit.Framework.Tests
         }
     }
 #endif
+#endif
 }
diff --git a/src/NUnitFramework/tests/Syntax/AfterTests.cs b/src/NUnitFramework/tests/Syntax/AfterTests.cs
index 3ed571f..4f675c1 100644
--- a/src/NUnitFramework/tests/Syntax/AfterTests.cs
+++ b/src/NUnitFramework/tests/Syntax/AfterTests.cs
@@ -44,9 +44,9 @@ namespace NUnit.Framework.Syntax
 			inheritedSyntax = Helper().GreaterThan(0).And.LessThan(10).After(1000);
 			builderSyntax = Builder().GreaterThan(0).And.LessThan(10).After(1000);
 		}
-	}
+    }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     public abstract class AfterSyntaxTests
     {
         protected bool flag;
diff --git a/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs b/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
index 4627a2d..44c4f9c 100644
--- a/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
+++ b/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
@@ -27,10 +33,10 @@ namespace NUnit.Framework.Syntax
         public void CanMatchCustomConstraintsUnderAndOperator()
         {
             IResolveConstraint constraint = Is.All.Matches(custom).And.Matches(another);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <and <custom> <another>>>")); 
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <and <custom> <another>>>"));
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test]
         public void CanMatchPredicate()
         {
@@ -44,7 +50,7 @@ namespace NUnit.Framework.Syntax
             return (num & 1) == 0;
         }
 
-#if CS_3_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void CanMatchLambda()
         {
diff --git a/src/NUnitFramework/tests/Syntax/CollectionTests.cs b/src/NUnitFramework/tests/Syntax/CollectionTests.cs
index e592af3..4cd1f30 100644
--- a/src/NUnitFramework/tests/Syntax/CollectionTests.cs
+++ b/src/NUnitFramework/tests/Syntax/CollectionTests.cs
@@ -6,7 +6,7 @@
 
 using System;
 using System.Collections;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 using NUnit.Framework.Tests;
diff --git a/src/NUnitFramework/tests/Syntax/EqualityTests.cs b/src/NUnitFramework/tests/Syntax/EqualityTests.cs
index 8187ca8..f5e7f1e 100644
--- a/src/NUnitFramework/tests/Syntax/EqualityTests.cs
+++ b/src/NUnitFramework/tests/Syntax/EqualityTests.cs
@@ -5,7 +5,7 @@
 // ****************************************************************
 
 using System;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -62,7 +62,7 @@ namespace NUnit.Framework.Syntax
             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
+#if CLR_2_0 || CLR_4_0
             List<string> list = new List<string>();
             list.Add("foo");
             list.Add("bar");
diff --git a/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs b/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
index 2b80067..91e02ce 100644
--- a/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
+++ b/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
@@ -8,7 +8,7 @@ using System;
 using System.Collections;
 using System.CodeDom.Compiler;
 using NUnit.Framework.Constraints;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
diff --git a/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs b/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
index 9645d6b..a73e249 100644
--- a/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
+++ b/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
@@ -56,6 +56,30 @@ namespace NUnit.Framework.Syntax
         }
     }
 
+    public class PositiveTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthan 0>";
+            staticSyntax = Is.Positive;
+            inheritedSyntax = Helper().Positive;
+            builderSyntax = Builder().Positive;
+        }
+    }
+
+    public class NegativeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthan 0>";
+            staticSyntax = Is.Negative;
+            inheritedSyntax = Helper().Negative;
+            builderSyntax = Builder().Negative;
+        }
+    }
+
     public class EmptyTest : SyntaxTest
     {
         [SetUp]
diff --git a/src/NUnitFramework/tests/Syntax/TestCompiler.cs b/src/NUnitFramework/tests/Syntax/TestCompiler.cs
index 363a761..b6f583c 100644
--- a/src/NUnitFramework/tests/Syntax/TestCompiler.cs
+++ b/src/NUnitFramework/tests/Syntax/TestCompiler.cs
@@ -6,16 +6,17 @@
 
 using System;
 using System.CodeDom.Compiler;
+using System.IO;
 
 namespace NUnit.Framework.Syntax
 {
     class TestCompiler
     {
         Microsoft.CSharp.CSharpCodeProvider provider;
-#if !NET_2_0
+#if CLR_1_0 || CLR_1_1
 		ICodeCompiler compiler;
 #endif
-		CompilerParameters options;
+        CompilerParameters options;
 
 		public TestCompiler() : this( null, null ) { }
 
@@ -24,10 +25,10 @@ namespace NUnit.Framework.Syntax
 		public TestCompiler( string[] assemblyNames, string outputName )
 		{
 			this.provider = new Microsoft.CSharp.CSharpCodeProvider();
-#if !NET_2_0
+#if CLR_1_0 || CLR_1_1
 			this.compiler = provider.CreateCompiler();
 #endif
-			this.options = new CompilerParameters();
+            this.options = new CompilerParameters();
 
 			if ( assemblyNames != null && assemblyNames.Length > 0 )
 				options.ReferencedAssemblies.AddRange( assemblyNames );
@@ -35,7 +36,7 @@ namespace NUnit.Framework.Syntax
 				options.OutputAssembly = outputName;
 
 			options.IncludeDebugInformation = false;
-			options.TempFiles = new TempFileCollection( ".", false );
+			options.TempFiles = new TempFileCollection( Path.GetTempPath(), false );
 			options.GenerateInMemory = false;
 		}
 
@@ -45,9 +46,9 @@ namespace NUnit.Framework.Syntax
 		}
 
 		public CompilerResults CompileCode( string code )
-		{
-#if NET_2_0
-			return provider.CompileAssemblyFromSource( options, code );
+        {
+#if CLR_2_0 || CLR_4_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
index dbfddfa..c97e8bf 100644
--- a/src/NUnitFramework/tests/Syntax/ThrowsTests.cs
+++ b/src/NUnitFramework/tests/Syntax/ThrowsTests.cs
@@ -159,8 +159,8 @@ namespace NUnit.Framework.Syntax
         }
 
         // TODO: Move these to AssertThat tests
-#if NET_2_0
-#if CS_3_0
+#if CLR_2_0 || CLR_4_0
+#if CS_3_0 || CS_4_0
         [Test]
         public void DelegateThrowsException()
         {
diff --git a/src/NUnitFramework/tests/Syntax/TypeConstraints.cs b/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
index d32bf7e..32cc035 100644
--- a/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
+++ b/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
@@ -99,7 +99,7 @@ namespace NUnit.Framework.Syntax
         }
     }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     [TestFixture]
     public class ExactTypeTest_Generic : SyntaxTest
     {
diff --git a/src/NUnitFramework/tests/TestDelegates.cs b/src/NUnitFramework/tests/TestDelegates.cs
index efd477c..8016bfd 100644
--- a/src/NUnitFramework/tests/TestDelegates.cs
+++ b/src/NUnitFramework/tests/TestDelegates.cs
@@ -16,12 +16,12 @@ namespace NUnit.Framework.Tests
 
         public static void ThrowsApplicationException()
         {
-            throw new ApplicationException();
+            throw new ApplicationException("my message");
         }
 
         public static void ThrowsSystemException()
         {
-            throw new Exception();
+            throw new Exception("my message");
         }
 
         public static void ThrowsNothing()
diff --git a/src/NUnitFramework/tests/TestFixtureAttributeTests.cs b/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
index f35c874..caa9886 100644
--- a/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
+++ b/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
@@ -10,7 +10,7 @@ namespace NUnit.Framework.Tests
     public class TestFixtureAttributeTests
     {
         static object[] fixtureArgs = new object[] { 10, 20, "Charlie" };
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         static Type[] typeArgs = new Type[] { typeof(int), typeof(string) };
         static object[] combinedArgs = new object[] { typeof(int), typeof(string), 10, 20, "Charlie" };
 #endif
@@ -20,7 +20,7 @@ namespace NUnit.Framework.Tests
         {
             TestFixtureAttribute attr = new TestFixtureAttribute();
             Assert.That(attr.Arguments.Length == 0);
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.That(attr.TypeArgs.Length == 0);
 #endif
         }
@@ -30,12 +30,12 @@ namespace NUnit.Framework.Tests
         {
             TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
             Assert.That(attr.Arguments, Is.EqualTo( fixtureArgs ) );
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.That(attr.TypeArgs.Length == 0 );
 #endif
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         [Test, Category("Generics")]
         public void ConstructWithJustTypeArgs()
         {
diff --git a/src/NUnitFramework/tests/TypeAssertTest.cs b/src/NUnitFramework/tests/TypeAssertTest.cs
index c259e7b..cb9de89 100644
--- a/src/NUnitFramework/tests/TypeAssertTest.cs
+++ b/src/NUnitFramework/tests/TypeAssertTest.cs
@@ -34,7 +34,7 @@ namespace NUnit.Framework.Tests
 
 			Assert.IsInstanceOf(typeof(System.Exception), ex );
             Expect( ex, InstanceOf(typeof(Exception)));
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.IsInstanceOf<Exception>( ex );
 #endif
 		}
@@ -53,8 +53,8 @@ namespace NUnit.Framework.Tests
 		{
 			Assert.IsNotInstanceOf(typeof(System.Int32), "abc123" );
 			Expect( "abc123", Not.InstanceOf(typeof(System.Int32)) );
-#if NET_2_0
-			Assert.IsNotInstanceOf<System.Int32>("abc123");
+#if CLR_2_0 || CLR_4_0
+            Assert.IsNotInstanceOf<System.Int32>("abc123");
 #endif
 		}
 
@@ -74,7 +74,7 @@ namespace NUnit.Framework.Tests
 
             Assert.IsAssignableFrom(typeof(int[]), array10);
             Expect(array10, AssignableFrom(typeof(int[])));
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             Assert.IsAssignableFrom<int[]>(array10);
 #endif
         }
@@ -98,8 +98,8 @@ namespace NUnit.Framework.Tests
 
 			Assert.IsNotAssignableFrom( typeof(int[,] ),array10);
 			Expect( array10, Not.AssignableFrom( typeof(int[,] ) ) );
-#if NET_2_0
-			Assert.IsNotAssignableFrom<int[,]>(array10);
+#if CLR_2_0 || CLR_4_0
+            Assert.IsNotAssignableFrom<int[,]>(array10);
 #endif
 		}
 
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.build b/src/NUnitFramework/tests/nunit.framework.tests.build
index b23cab9..69b445e 100644
--- a/src/NUnitFramework/tests/nunit.framework.tests.build
+++ b/src/NUnitFramework/tests/nunit.framework.tests.build
@@ -10,11 +10,13 @@
     <include name="Constraints/ComparisonConstraintTests.cs"/>
     <include name="Constraints/ConstraintTestBase.cs"/>
     <include name="Constraints/EmptyConstraintTest.cs"/>
+    <include name="Constraints/EqualConstraintTests.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/NUnitEqualityComparerTests.cs"/>
     <include name="Constraints/OrTest.cs"/>
     <include name="Constraints/PathConstraintTests.cs"/>
     <include name="Constraints/PropertyTests.cs"/>
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.csproj b/src/NUnitFramework/tests/nunit.framework.tests.csproj
index 33f1db0..21f8c8e 100644
--- a/src/NUnitFramework/tests/nunit.framework.tests.csproj
+++ b/src/NUnitFramework/tests/nunit.framework.tests.csproj
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{8C326431-AE57-4645-ACC1-A90A0B425129}</ProjectGuid>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -22,14 +22,14 @@
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
     <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v3.5</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>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -46,7 +46,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0;CSHARP_3_0;MONO</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -62,6 +62,9 @@
     <Reference Include="System">
       <Name>System</Name>
     </Reference>
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
     <Reference Include="System.Data">
       <Name>System.Data</Name>
     </Reference>
@@ -99,11 +102,13 @@
     <Compile Include="Constraints\ComparisonConstraintTests.cs" />
     <Compile Include="Constraints\ConstraintTestBase.cs" />
     <Compile Include="Constraints\EmptyConstraintTest.cs" />
+    <Compile Include="Constraints\EqualConstraintTests.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\NUnitEqualityComparerTests.cs" />
     <Compile Include="Constraints\OrTest.cs" />
     <Compile Include="Constraints\PathConstraintTests.cs" />
     <Compile Include="Constraints\PropertyTests.cs" />
diff --git a/src/NUnitMocks/mocks/DynamicMock.cs b/src/NUnitMocks/mocks/DynamicMock.cs
index 60a5eff..b6d48ba 100644
--- a/src/NUnitMocks/mocks/DynamicMock.cs
+++ b/src/NUnitMocks/mocks/DynamicMock.cs
@@ -11,6 +11,7 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// Summary description for DynamicMock.
 	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
 	public class DynamicMock : Mock
 	{
 		private Type type;
diff --git a/src/NUnitMocks/mocks/ICall.cs b/src/NUnitMocks/mocks/ICall.cs
index c20fff8..37903f2 100644
--- a/src/NUnitMocks/mocks/ICall.cs
+++ b/src/NUnitMocks/mocks/ICall.cs
@@ -12,7 +12,8 @@ namespace NUnit.Mocks
 	/// The ICall interface is implemented by objects that can be called
 	/// with an array of arguments and return a value.
 	/// </summary>
-	public interface ICall
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface ICall
 	{
 		/// <summary>
 		/// Process a call with a possibly empty set of arguments.
diff --git a/src/NUnitMocks/mocks/ICallHandler.cs b/src/NUnitMocks/mocks/ICallHandler.cs
index 27550de..f73cf01 100644
--- a/src/NUnitMocks/mocks/ICallHandler.cs
+++ b/src/NUnitMocks/mocks/ICallHandler.cs
@@ -12,7 +12,8 @@ namespace NUnit.Mocks
 	/// The ICallHandler interface dispatches calls to methods or
 	/// other objects implementing the ICall interface.
 	/// </summary>
-	public interface ICallHandler
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface ICallHandler
 	{		
 		/// <summary>
 		/// Simulate a method call on the mocked object.
diff --git a/src/NUnitMocks/mocks/IMethod.cs b/src/NUnitMocks/mocks/IMethod.cs
index 49abee5..a1468b7 100644
--- a/src/NUnitMocks/mocks/IMethod.cs
+++ b/src/NUnitMocks/mocks/IMethod.cs
@@ -12,7 +12,8 @@ namespace NUnit.Mocks
 	/// The IMethod interface represents an method or other named object that 
 	/// is both callable and self-verifying.
 	/// </summary>
-	public interface IMethod : IVerify, ICall
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface IMethod : IVerify, ICall
 	{
 		/// <summary>
 		/// The name of the object
diff --git a/src/NUnitMocks/mocks/IMock.cs b/src/NUnitMocks/mocks/IMock.cs
index 2c770dc..beed5da 100644
--- a/src/NUnitMocks/mocks/IMock.cs
+++ b/src/NUnitMocks/mocks/IMock.cs
@@ -11,7 +11,8 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// Summary description for IMock.
 	/// </summary>
-	public interface IMock : IVerify, ICallHandler
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface IMock : IVerify, ICallHandler
 	{
 		/// <summary>
 		/// The name of this mock - used in messages
diff --git a/src/NUnitMocks/mocks/IVerify.cs b/src/NUnitMocks/mocks/IVerify.cs
index e28f71a..bafdc42 100644
--- a/src/NUnitMocks/mocks/IVerify.cs
+++ b/src/NUnitMocks/mocks/IVerify.cs
@@ -11,7 +11,8 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// The IVerify interface is implemented by objects capable of self-verification.
 	/// </summary>
-	public interface IVerify
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface IVerify
 	{
 		void Verify();
 	}
diff --git a/src/NUnitMocks/mocks/MethodSignature.cs b/src/NUnitMocks/mocks/MethodSignature.cs
index d7cd486..94efd6b 100644
--- a/src/NUnitMocks/mocks/MethodSignature.cs
+++ b/src/NUnitMocks/mocks/MethodSignature.cs
@@ -11,7 +11,8 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// Summary description for MockSignature.
 	/// </summary>
-	public class MethodSignature
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MethodSignature
 	{
 		public readonly string typeName;
 		public readonly string methodName;
diff --git a/src/NUnitMocks/mocks/Mock.cs b/src/NUnitMocks/mocks/Mock.cs
index 0f2c02c..4b339c6 100644
--- a/src/NUnitMocks/mocks/Mock.cs
+++ b/src/NUnitMocks/mocks/Mock.cs
@@ -15,7 +15,8 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// Summary description for MockObject.
 	/// </summary>
-	public class Mock : IMock
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class Mock : IMock
 	{
 		#region Private Fields
 
diff --git a/src/NUnitMocks/mocks/MockCall.cs b/src/NUnitMocks/mocks/MockCall.cs
index 0c0df99..8b1378a 100644
--- a/src/NUnitMocks/mocks/MockCall.cs
+++ b/src/NUnitMocks/mocks/MockCall.cs
@@ -13,7 +13,8 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// Summary description for ExpectedCall.
 	/// </summary>
-	public class MockCall : ICall
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MockCall : ICall
 	{
 		private MethodSignature signature;
 		private object returnVal;
diff --git a/src/NUnitMocks/mocks/MockInterfaceHandler.cs b/src/NUnitMocks/mocks/MockInterfaceHandler.cs
index fc3b44c..6426574 100644
--- a/src/NUnitMocks/mocks/MockInterfaceHandler.cs
+++ b/src/NUnitMocks/mocks/MockInterfaceHandler.cs
@@ -15,7 +15,8 @@ namespace NUnit.Mocks
 	/// <summary>
 	/// Summary description for MockInterfaceHandler.
 	/// </summary>
-	public class MockInterfaceHandler : RealProxy
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MockInterfaceHandler : RealProxy
 	{
 		private ICallHandler callHandler;
 
diff --git a/src/NUnitMocks/mocks/MockMethod.cs b/src/NUnitMocks/mocks/MockMethod.cs
index b775650..f828242 100644
--- a/src/NUnitMocks/mocks/MockMethod.cs
+++ b/src/NUnitMocks/mocks/MockMethod.cs
@@ -17,7 +17,8 @@ namespace NUnit.Mocks
 	/// of calls. If it has a call sequence, then the signature must match and
 	/// each call provides it's own return value or exception.
 	/// </summary>
-	public class MockMethod : IMethod
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MockMethod : IMethod
 	{
 		#region Private Fields
 
diff --git a/src/NUnitMocks/mocks/nunit.mocks.csproj b/src/NUnitMocks/mocks/nunit.mocks.csproj
index 23f7ea8..d3112ff 100644
--- a/src/NUnitMocks/mocks/nunit.mocks.csproj
+++ b/src/NUnitMocks/mocks/nunit.mocks.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
diff --git a/src/NUnitMocks/tests/DynamicMockTests.cs b/src/NUnitMocks/tests/DynamicMockTests.cs
index a6b7277..2d53431 100644
--- a/src/NUnitMocks/tests/DynamicMockTests.cs
+++ b/src/NUnitMocks/tests/DynamicMockTests.cs
@@ -13,7 +13,8 @@ namespace NUnit.Mocks.Tests
 	/// Summary description for DynamicMockTests.
 	/// </summary>
 	[TestFixture]
-	public class DynamicMockTests
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class DynamicMockTests
 	{
 		private DynamicMock mock;
 		private IStuff instance;
diff --git a/src/NUnitMocks/tests/MockTests.cs b/src/NUnitMocks/tests/MockTests.cs
index 49ee5f3..d9480ba 100644
--- a/src/NUnitMocks/tests/MockTests.cs
+++ b/src/NUnitMocks/tests/MockTests.cs
@@ -12,7 +12,8 @@ namespace NUnit.Mocks.Tests
 	/// <summary>
 	/// Summary description for MockTests.
 	/// </summary>
-	[TestFixture]
+    [TestFixture]
+    [Obsolete("NUnit now uses NSubstitute")]
 	public class MockTests
 	{
 		private Mock mock;
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests.csproj b/src/NUnitMocks/tests/nunit.mocks.tests.csproj
index f6e9f40..f307b08 100644
--- a/src/NUnitMocks/tests/nunit.mocks.tests.csproj
+++ b/src/NUnitMocks/tests/nunit.mocks.tests.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
diff --git a/src/NUnitTestServer/nunit-agent-exe/App.config b/src/NUnitTestServer/nunit-agent-exe/App.config
index 84c2906..43adb3b 100644
--- a/src/NUnitTestServer/nunit-agent-exe/App.config
+++ b/src/NUnitTestServer/nunit-agent-exe/App.config
@@ -1,69 +1,37 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
-  
+  <!--
+   The .NET 2.0 build of nunit-agent only 
+   runs under .NET 2.0 or higher. The setting
+   useLegacyV2RuntimeActivationPolicy only applies 
+   under .NET 4.0 and permits use of mixed mode 
+   assemblies, which would otherwise not load 
+   correctly. 
+  -->
+  <startup useLegacyV2RuntimeActivationPolicy="true">
+    <!--
+     Nunit-agent is normally run by the console or gui
+     runners and not independently. In normal usage, 
+     the runner specifies which runtime should be used.
+     
+     Do NOT add any supportedRuntime elements here, 
+     since they may prevent the runner from controlling 
+     the runtime that is used!
+    -->
+  </startup>
+
   <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
+    <!-- Ensure that test exceptions don't crash NUnit -->
     <legacyUnhandledExceptionPolicy enabled="1" />
 
+    <!-- Run partial trust V2 assemblies in full trust under .NET 4.0 -->
+    <loadFromRemoteSources enabled="true" />
+
     <!-- 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/App.v1.config b/src/NUnitTestServer/nunit-agent-exe/App.v1.config
new file mode 100644
index 0000000..39b42ca
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/App.v1.config
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <!--
+   The .NET 1.1 build of nunit-agent only 
+   runs under .NET 1.0 or 1.1. Note that 
+   nunit-agent is normally run by the console 
+   or gui runners and not independently. In 
+   normal usage, the runner specifies which 
+   runtime should be used.
+
+   Do NOT add any supportedRuntime elements to
+   this file, since they may prevent the runner
+   from controlling the runtime that is used!
+  -->
+  <runtime>
+    <!-- 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/Ship.config b/src/NUnitTestServer/nunit-agent-exe/Ship.config
deleted file mode 100644
index 84c2906..0000000
--- a/src/NUnitTestServer/nunit-agent-exe/Ship.config
+++ /dev/null
@@ -1,69 +0,0 @@
-<?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
index f458eb4..c06be3c 100644
--- a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
+++ b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
@@ -24,13 +24,15 @@
       </references>
     </csc>
 
-    <copy file="Ship.config"
+    <copy file="App.config" if="${runtime.version >= '2.0'}"
+      tofile="${current.build.dir}/nunit-agent.exe.config"/>
+    <copy file="App.v1.config" unless="${runtime.version >= '2.0'}"
       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}">
+        platform="x86" if="${runtime.version >= '2.0'}">
       <sources>
         <patternset refid="source-files"/>
         <include name="../../GeneratedAssemblyInfo.cs"/>
@@ -44,7 +46,7 @@
       </references>
     </csc>
 
-    <copy file="Ship.config" if="${build.x86}"
+    <copy file="App.config" if="${runtime.version >= '2.0'}"
       tofile="${current.build.dir}/nunit-agent-x86.exe.config"/>
 
   </target>
@@ -54,7 +56,7 @@
       <fileset>
         <patternset refid="source-files" />
         <include name="App.config" />
-        <include name="Ship.config"/>
+        <include name="App.v1.config" />
         <include name="nunit-agent.exe.csproj"/>
         <include name="nunit-agent.exe.build"/>
       </fileset>
diff --git a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
index cd602e9..2a54e7a 100644
--- a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
+++ b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -30,7 +30,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
diff --git a/src/NUnitTestServer/nunit-server-exe/App.ico b/src/NUnitTestServer/nunit-server-exe/App.ico
deleted file mode 100644
index 3a5525f..0000000
Binary files a/src/NUnitTestServer/nunit-server-exe/App.ico and /dev/null differ
diff --git a/src/NUnitTestServer/nunit-server-exe/TestServerConsoleApp.cs b/src/NUnitTestServer/nunit-server-exe/TestServerConsoleApp.cs
deleted file mode 100644
index 94dcd3c..0000000
--- a/src/NUnitTestServer/nunit-server-exe/TestServerConsoleApp.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
-// ****************************************************************
-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
deleted file mode 100644
index 2d39b23..0000000
--- a/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.build
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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
deleted file mode 100644
index 09d6a86..0000000
--- a/src/NUnitTestServer/nunit-server-exe/nunit-server.exe.csproj
+++ /dev/null
@@ -1,110 +0,0 @@
-<?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.log.conf b/src/PNUnit/agent.log.conf
deleted file mode 100644
index d340cad..0000000
--- a/src/PNUnit/agent.log.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-<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
index efdeb08..4d15bae 100644
--- a/src/PNUnit/agent/AgentConfig.cs
+++ b/src/PNUnit/agent/AgentConfig.cs
@@ -5,21 +5,30 @@ using System.Xml.Serialization;
 
 namespace PNUnit.Agent
 {
-	[Serializable]
-	public class AgentConfig
-	{
-		public int Port;
-		public string PathToAssemblies;
-	}
+    [Serializable]
+    public class AgentConfig
+    {
+        public int Port;
+        public string PathToAssemblies;
+        public bool UseDomainPool;
+        public bool NoTimeout;
+    }
 
-	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);
-		}
-	}
+    public class AgentConfigLoader
+    {
+        public static AgentConfig LoadFromFile(string file)
+        {
+            FileStream reader = new FileStream(file, FileMode.Open, FileAccess.Read);
+            try
+            {
+                XmlSerializer ser= new XmlSerializer(typeof(AgentConfig));
+                return (AgentConfig)ser.Deserialize(reader);
+            }
+            finally
+            {
+                reader.Close();
+            }
+        }
+    }
 
 }
diff --git a/src/PNUnit/agent/App.config b/src/PNUnit/agent/App.config
index 5ed5f7b..2da8776 100644
--- a/src/PNUnit/agent/App.config
+++ b/src/PNUnit/agent/App.config
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 
   <!-- Set the level for tracing NUnit itself -->
diff --git a/src/PNUnit/agent/PNUnitTestRunner.cs b/src/PNUnit/agent/PNUnitTestRunner.cs
index 33aaba3..4225347 100644
--- a/src/PNUnit/agent/PNUnitTestRunner.cs
+++ b/src/PNUnit/agent/PNUnitTestRunner.cs
@@ -1,6 +1,7 @@
 using System;
 using System.IO;
 using System.Threading;
+using System.Collections;
 using System.Collections.Specialized;
 using System.Diagnostics;
 using System.Text;
@@ -13,369 +14,531 @@ 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;
+    public class PNUnitTestRunner
+    {
+        private delegate TestResult RunTestWithTimeoutDelegate(ConsoleWriter outStream, TestDomain testDomain);
+        private static readonly ILog log = LogManager.GetLogger(typeof(PNUnitTestRunner));
+        private PNUnitTestInfo mPNUnitTestInfo;
+        private AgentConfig mConfig;
+        private static object obj = new object();
+        private bool mbUseDomainPool = false;
+        private int TEST_TIMEOUT = 600000;
+
+        public PNUnitTestRunner(
+            PNUnitTestInfo info,
+            AgentConfig config)
+        {
+            mConfig = config;
+            mPNUnitTestInfo = info;
+            mbUseDomainPool = config.UseDomainPool;
+        }
 
-				Test test = MakeTest(testDomain, Path.Combine(mConfig.PathToAssemblies, mTestInfo.AssemblyName));
-#endif
+        public void Run()
+        {
+            log.Debug("Spawning a new thread");
+            Thread thread = new Thread(new ThreadStart(ThreadProc));
+            thread.Start();
+        }
 
-                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)
+        private static Queue mFreeDomains = new Queue();
+
+        private void ThreadProc()
         {
-            TestPackage package = new TestPackage(assemblyName);
-            package.Settings["ShadowCopyFiles"] = false;
+            TestResult result = null;
+
+            TestDomain testDomain = null;
+
+            TestConsoleAccess consoleAccess = new TestConsoleAccess();
+
+            try
+            {
+                log.DebugFormat("Thread entered for Test {0}:{1} Assembly {2}",
+                    mPNUnitTestInfo.TestName,
+                    mPNUnitTestInfo.TestToRun,
+                    mPNUnitTestInfo.AssemblyName);
+
+                ConsoleWriter outStream = new ConsoleWriter(Console.Out);
+                ConsoleWriter errorStream = new ConsoleWriter(Console.Error);
+
+                testDomain = SetupTest(consoleAccess);
+
+                if( testDomain == null )
+                    return;
+
+                log.Debug("Running tests");
+
+                try
+                {
+                    if(mConfig.NoTimeout)
+                    {
+                        result = RunTest(outStream, testDomain);
+                    }
+                    else
+                    {
+                        RunTestWithTimeoutDelegate deleg = new RunTestWithTimeoutDelegate(
+                            RunTest);
+                        IAsyncResult ar = deleg.BeginInvoke(outStream, testDomain, null, new object());
+                        if (!ar.AsyncWaitHandle.WaitOne(TEST_TIMEOUT, false))
+                        {
+                            testDomain.CancelRun();
+                            throw new Exception("Test timeout exception");
+                        }
+                        else  
+                        {
+                            result = deleg.EndInvoke(ar);
+                        }
+                    }
+                }
+                catch( Exception e )
+                {
+                    result = BuildError(e, consoleAccess);
+                    log.ErrorFormat("Error running test {0}", e.Message);
+                }
+
+            }
+            finally
+            {
+                log.Info("Notifying the results");
+
+                log.Debug("////////////////////////////////////////Notifying the results/////////////////////////");
 
-            return testDomain.Load(package) ? testDomain.Test : null;
+                mPNUnitTestInfo.Services.NotifyResult(
+                    mPNUnitTestInfo.TestName, BuildResult(result, consoleAccess, mPNUnitTestInfo));
+
+                log.Debug("////////////////////////////////////////Results NOTIFIED/////////////////////////");
+                result = null;
+
+                ReleaseDomain(testDomain);
+            }
         }
-#else
-        private Test MakeTest(TestDomain testDomain, string assemblyName)
-		{
-			NUnitProject project;
-                
-			project = NUnitProject.FromAssembly(assemblyName);
-                                 
-			return testDomain.Load(project);
+
+        private TestResult RunTest(ConsoleWriter outStream, TestDomain testDomain)
+        {
+            EventListener collector = new EventCollector( outStream );
+
+            ITestFilter filter = new NUnit.Core.Filters.SimpleNameFilter(mPNUnitTestInfo.TestToRun);
+            TestResult result =
+                FindResult(
+                mPNUnitTestInfo.TestToRun,
+                testDomain.Run(collector, filter, false, LoggingThreshold.Off) );
+            return result;
         }
+
+        private void ReleaseDomain(TestDomain testDomain)
+        {
+#if !NET_2_0
+            lock(obj)
 #endif
+            {
+                lock( mFreeDomains.SyncRoot )
+                {
+                    log.Debug("************************ RELEASING A TESTDOMAIN ************************************");
+                    if( mbUseDomainPool )
+                    {
+                        mFreeDomains.Enqueue(testDomain);
+                    }
+                    else
+                    {
+                        testDomain.Unload();
+                    }
+                }
+            }
+        }
+
+        private TestDomain SetupTest(TestConsoleAccess consoleAccess)
+        {
+            try
+            {
+                TestDomain result;
+
+                lock( mFreeDomains.SyncRoot )
+                {
+                    log.Debug(">Locking mFreeDomains.SyncRoot");
+
+                    if( mbUseDomainPool && mFreeDomains.Count > 0 )
+                    {
+                        log.Debug("Reusing a previously created TestDomain");
+                        result = mFreeDomains.Dequeue() as TestDomain;
+                        CreatePNUnitServices(result, consoleAccess);
+                        return result;
+                    }
+
+                    log.Debug("Creating a new TestDomain");
+                    result = new TestDomain();
+
+                    bool testLoaded = MakeTest(
+                        result,
+                        Path.Combine(mConfig.PathToAssemblies, mPNUnitTestInfo.AssemblyName),
+                        GetShadowCopyCacheConfig());
+
+                    log.Debug("MakeTest executed");
+
+                    if( !testLoaded )
+                    {
+                        log.InfoFormat("Unable to locate test {0}", mPNUnitTestInfo.TestName);
+                        TestResult testResult = BuildError("Unable to locate tests", consoleAccess);
 
-		#region MarshallByRefObject
-		// Lives forever
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-		#endregion
+                        mPNUnitTestInfo.Services.NotifyResult(
+                            mPNUnitTestInfo.TestName, testResult);
 
+                        return null;
+                    }
 
-		#region Nested Class to Handle Events
+                    log.Debug("Test loaded, going to set CurrentDirectory");
 
-#if NUNIT_2_5
-        private class EventCollector : MarshalByRefObject, EventListener
+                    Directory.SetCurrentDirectory(mConfig.PathToAssemblies); // test directory ?
+
+                    log.Debug("Creating PNUnit services");
+
+                    CreatePNUnitServices(result, consoleAccess);
+
+                    return result;
+                }
+            }
+            finally
+            {
+                log.Debug("<Unlocking mFreeDomains.SyncRoot");
+            }
+        }
+
+        private void CreatePNUnitServices(
+            TestDomain testDomain,
+            TestConsoleAccess consoleAccess)
+        {
+            log.Info("Creating PNUnitServices in the AppDomain of the test");
+
+            object[] param = { mPNUnitTestInfo, consoleAccess };
+
+            try
+            {
+                System.Runtime.Remoting.ObjectHandle obj
+#if NET_2_0
+                        = Activator.CreateInstance(
+                            testDomain.AppDomain,
 #else
-        private class EventCollector : LongLivingMarshalByRefObject, EventListener
+                    = testDomain.AppDomain.CreateInstance(
 #endif
+                    typeof(PNUnitServices).Assembly.FullName,
+                    typeof(PNUnitServices).FullName,
+                    false, BindingFlags.Default, null, param, null, null, null);
+                obj.Unwrap();
+            }
+            catch( Exception e )
+            {
+                BuildError(e, consoleAccess);
+                log.ErrorFormat("Error running test {0}", e.Message);
+                return;
+            }
+        }
+
+        private TestResult BuildResult(
+            TestResult result,
+            TestConsoleAccess consoleAccess,
+            PNUnitTestInfo testInfo)
+        {
+            //the test namespace contains errors
+            if( result == null )
+            {
+                TestName testName = new TestName();
+                testName.Name = testInfo.TestName;
+
+                string errormsg = "The test {0} couldn't be found in the assembly {1}";
+
+                result = new PNUnitTestResult(testName, string.Empty);
+                result.Failure(
+                    string.Format(errormsg, testInfo.TestToRun, testInfo.AssemblyName),
+                    string.Empty);
+
+                return result;
+            }
+
+            if( !result.IsSuccess /*|| ReturnTestOutput()*/ )
+                return new PNUnitTestResult(result, consoleAccess.GetTestOutput());
+            else
+                return result;
+        }
+
+        private TestResult BuildError(Exception e, TestConsoleAccess consoleAccess)
         {
-			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)
+            TestName testName = new TestName();
+            testName.Name = mPNUnitTestInfo.TestName;
+            testName.FullName = mPNUnitTestInfo.TestName;
+            testName.TestID = new TestID();
+
+            TestResult result = new PNUnitTestResult(testName, consoleAccess.GetTestOutput());
+            result.Error(e);
+            return result;
+        }
+
+        private TestResult BuildError(string message, TestConsoleAccess consoleAccess)
+        {
+            TestName testName = new TestName();
+            testName.Name = mPNUnitTestInfo.TestName;
+            testName.FullName = mPNUnitTestInfo.TestName;
+            testName.TestID = new TestID();
+
+            TestResult result = new PNUnitTestResult(testName, consoleAccess.GetTestOutput());
+            result.Failure(message, string.Empty);
+            return result;
+        }
+
+        private bool ReturnTestOutput()
+        {
+            string returnOutput = PNUnitServices.Get().GetUserValue("return_output");
+            return returnOutput == "true";
+        }
+
+        private static TestResult FindResult(string name, TestResult result)
+        {
+            if( result.Test.TestName.FullName == name )
+                return result;
+
+            if( result.HasResults )
+            {
+                foreach( TestResult r in result.Results )
+                {
+                    TestResult myResult = FindResult(name, r);
+                    if( myResult != null )
+                        return myResult;
+                }
+            }
+
+            return null;
+        }
+
+        private bool MakeTest(
+            TestRunner runner,
+            string assemblyName,
+            bool bShadowCopyCache)
+        {
+            log.Debug("Entering MakeTest");
+            TestPackage package = new TestPackage(
+                Path.GetFullPath(assemblyName));
+            package.Settings["ShadowCopyFiles"] = bShadowCopyCache;
+            return runner.Load(package);
+        }
+
+        private bool GetShadowCopyCacheConfig()
+        {
+            return false;
+/*            if (mConfig.ShadowCopyCache != null)
+                if (mConfig.ShadowCopyCache.ToLower().IndexOf("false") != -1 )
+                    return false;
+*/
+
+        }
+
+        #region Nested Class to Handle Events
+
+        [Serializable]
+        private class EventCollector : EventListener
+        {
+            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;
+            }
+
+            public void RunStarted(Test[] tests)
+            {
+            }
+
+            public void RunStarted(string a, int b)
+            {
+            }
+
+            public void RunFinished(TestResult[] results)
+            {
+            }
+
+            public void RunFinished(Exception exception)
             {
             }
 
             public void RunFinished(TestResult result)
             {
             }
-#else
-			public void RunStarted(Test[] tests)
-			{
-			}
 
-			public void RunFinished(TestResult[] results)
-			{
-			}
-#endif
+            public void TestFinished(TestResult testResult)
+            {
+                if(testResult.Executed)
+                {
+                    testRunCount++;
+
+                    if(testResult.IsFailure)
+                    {
+                        failureCount++;
+                        Console.Write("F");
+                        if ( debugger )
+                        {
+                            messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.TestName ) );
+                            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");
+                }
 
-			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()
+                currentTestName = string.Empty;
+            }
+
+            public void TestStarted(TestMethod testCase)
             {
-                return null;
+                currentTestName = testCase.TestName.FullName;
             }
+
+            public void TestStarted(TestName testName)
+            {
+                currentTestName = testName.FullName;
+            }
+
+
+            public void SuiteStarted(TestName name)
+            {
+                if ( debugger && level++ == 0 )
+                {
+                    testRunCount = 0;
+                    testIgnoreCount = 0;
+                    failureCount = 0;
+                    Trace.WriteLine( "################################ UNIT TESTS ################################" );
+                    Trace.WriteLine( "Running tests in '" + name + "'..." );
+                }
+            }
+
+            public void SuiteFinished(TestResult 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)
+            {
+            }
+        }
+
+        #endregion
+
+        public static bool IsWindows()
+        {
+            switch (Environment.OSVersion.Platform)
+            {
+                case PlatformID.Win32Windows:
+                case System.PlatformID.Win32S:
+                case PlatformID.Win32NT:
+                    return true;
+            }
+            return false;
+        }
+    }
+
+    public class TestConsoleAccess: MarshalByRefObject, ITestConsoleAccess
+    {
+        StringBuilder mBuilder = new StringBuilder();
+
+        public void WriteLine(string s)
+        {
+#if NET_2_0
+            mBuilder.AppendLine(s);
+#else
+            mBuilder.Append(s + "\n");
 #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;
-		}
-	}
+            Console.WriteLine(s);
+        }
+
+        public void Write(char[] buf)
+        {
+            mBuilder.Append(buf);
+            Console.Write(buf);
+        }
+
+        public void Write(char[] buf, int index, int count)
+        {
+            mBuilder.Append(buf, index, count);
+            Console.Write(buf, index, count);
+        }
+
+        public string GetTestOutput()
+        {
+            return mBuilder.ToString();
+        }
+
+        public override object InitializeLifetimeService()
+        {
+            return null;
+        }
+
+    }
 }
diff --git a/src/PNUnit/agent/Ship.config b/src/PNUnit/agent/Ship.config
index 5ed5f7b..2da8776 100644
--- a/src/PNUnit/agent/Ship.config
+++ b/src/PNUnit/agent/Ship.config
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 
   <!-- Set the level for tracing NUnit itself -->
diff --git a/src/PNUnit/agent/agent.cs b/src/PNUnit/agent/agent.cs
index f1fac64..0791f61 100644
--- a/src/PNUnit/agent/agent.cs
+++ b/src/PNUnit/agent/agent.cs
@@ -6,141 +6,251 @@ using System.Runtime.Remoting.Channels;
 using System.Runtime.Remoting.Channels.Tcp;
 using System.Runtime.Serialization.Formatters;
 using System.Reflection;
+using System.Threading;
 
 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
+    class Agent
+    {
+        [STAThread]
+        static void Main(string[] args)
+        {
+            ConfigureLogging();
+
+            AgentConfig config = new AgentConfig();
+
+            // read --daemon
+            bool bDaemonMode = ReadFlag(args, "--daemon");
+
+            bool bDomainPool = ReadFlag(args, "--domainpool");
+
+            bool bNoTimeout = ReadFlag(args, "--notimeout");
+
+            string configfile = ReadArg(args);
+
+            int port = -1;
+
+            string pathtoassemblies = ReadArg(args);
+
+            if (pathtoassemblies != null)
+            {
+                port = int.Parse(configfile);
+                configfile = null;
+            }
+
+            // Load the test configuration file
+            if (pathtoassemblies == null && configfile == null)
+            {
+                Console.WriteLine("Usage: agent [configfile | port path_to_assemblies] [--daemon] [--domainpool] [--noTimeout]");
+                return;
+            }
+
+            if (configfile != null)
+            {
+                config = AgentConfigLoader.LoadFromFile(configfile);
+
+                if (config == null)
+                {
+                    Console.WriteLine("No agent.conf file found");
+                }
+            }
+            else
+            {
+                config.Port = port;
+                config.PathToAssemblies = pathtoassemblies;
+            }
+
+            // only override if set
+            if( bDomainPool )
+            {
+                config.UseDomainPool = true;
+            }
+
+            if( bNoTimeout )
+            {
+                config.NoTimeout = true;
+            }
+
+            // initialize NUnit services
+            // Add Standard Services to ServiceManager
+            ServiceManager.Services.AddService(new SettingsService());
+            ServiceManager.Services.AddService(new DomainManager());
+            ServiceManager.Services.AddService(new ProjectService());
+
+            // initialize NUnit services
+            // Add Standard Services to ServiceManager
             ServiceManager.Services.AddService(new SettingsService());
             ServiceManager.Services.AddService(new DomainManager());
-            // TODO: We use ProjectService in DomainManager - try to eliminate
             ServiceManager.Services.AddService(new ProjectService());
+
+            // Initialize Services
+            ServiceManager.Services.InitializeServices();
+
+
+            PNUnitAgent agent = new PNUnitAgent();
+            agent.Run(config, bDaemonMode);
+        }
+
+        private static bool ReadFlag(string[] args, string flag)
+        {
+            for (int i = args.Length - 1; i >= 0; --i)
+                if (args[i] == flag)
+                {
+                    args[i] = null;
+                    return true;
+                }
+
+            return false;
+        }
+
+        private static string ReadArg(string[] args)
+        {
+            for (int i = 0; i < args.Length; ++i)
+                if (args[i] != null)
+                {
+                    string result = args[i];
+                    args[i] = null;
+                    return result;
+                }
+            return null;
+        }
+
+        private static void ConfigureLogging()
+        {
+            string log4netpath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "agent.log.conf");
+            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(PNUnitTestInfo 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
+
+
+        private void ConfigureRemoting(int port)
+        {
+            if( File.Exists("agent.remoting.conf") )
+            {
+                log.Info("Using agent.remoting.conf");
+#if CLR_2_0 || CLR_4_0
+                RemotingConfiguration.Configure("agent.remoting.conf", false);
+#else
+                RemotingConfiguration.Configure("agent.remoting.conf");
 #endif
+                return;
+            }
 
-			// 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
+            // init remoting
+            BinaryClientFormatterSinkProvider clientProvider =
+                new BinaryClientFormatterSinkProvider();
+            BinaryServerFormatterSinkProvider serverProvider =
+                new BinaryServerFormatterSinkProvider();
+            serverProvider.TypeFilterLevel =
+                System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
+
+            IDictionary props = new Hashtable();
+            props["port"] = 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}", port);
+#if CLR_2_0 || CLR_4_0
                 ChannelServices.RegisterChannel(chan, false);
 #else
-				ChannelServices.RegisterChannel(chan);
+                ChannelServices.RegisterChannel(chan);
 #endif
             }
-			catch( Exception e )
-			{
-				log.InfoFormat("Can't register channel.\n{0}", e.Message);
-				return;
-			}
+            catch (Exception e)
+            {
+                log.InfoFormat("Can't register channel.\n{0}", e.Message);
+                return;
+            }
+        }
 
-			// publish
-			RemotingServices.Marshal(this, PNUnit.Framework.Names.PNUnitAgentServiceName);
+        public void Run(AgentConfig config, bool bDaemonMode)
+        {
+            if( config.UseDomainPool )
+                log.Info("Agent using a domain pool to launch tests");
+            mConfig = config;
+
+            ConfigureRemoting(mConfig.Port);
+
+            // publish
+            RemotingServices.Marshal(this, PNUnit.Framework.Names.PNUnitAgentServiceName);
+
+            // otherwise in .NET 2.0 memory grows continuosly
+            FreeMemory();
+
+            if( bDaemonMode )
+            {
+                // wait continously
+                while (true)
+                {
+                    Thread.Sleep(10000);
+                }
+            }
+            else
+            {
+                string line;
+                while( (line = Console.ReadLine()) != "" )
+                {
+                    switch( line )
+                    {
+                        case "gc":
+                            Console.WriteLine("Cleaning up memory {0} Mb",
+                                GC.GetTotalMemory(true)/1024/1024);
+                            break;
+                        case "collect":
+                            Console.WriteLine("Collecting memory {0} Mb",
+                                GC.GetTotalMemory(false)/1024/1024);
+                            GC.Collect();
+                            Console.WriteLine("Memory collected {0} Mb",
+                                GC.GetTotalMemory(false)/1024/1024);
+                            break;
+                    }
+                }
+            }
 
-			// wait for a key to finish
-			Console.ReadLine();
+            //RemotingServices.Disconnect(this);
+        }
 
-			RemotingServices.Disconnect(this);
-		}
-	}
+        private void FreeMemory()
+        {
+            GC.GetTotalMemory(true);
+        }
+    }
 
 }
diff --git a/src/PNUnit/agent/pnunit-agent.build b/src/PNUnit/agent/pnunit-agent.build
index 355a66c..89a0796 100644
--- a/src/PNUnit/agent/pnunit-agent.build
+++ b/src/PNUnit/agent/pnunit-agent.build
@@ -13,7 +13,7 @@
     <csc target="exe"
         output="${current.build.dir}/pnunit-agent.exe"
         debug="${build.debug}" 
-        define="${build.defines};NUNIT_2_5">
+        define="${build.defines}">
       <sources basedir=".">
         <patternset refid="source-files"/>
       </sources>
diff --git a/src/PNUnit/agent/pnunit-agent.csproj b/src/PNUnit/agent/pnunit-agent.csproj
index 6d6ebbc..0af35b8 100644
--- a/src/PNUnit/agent/pnunit-agent.csproj
+++ b/src/PNUnit/agent/pnunit-agent.csproj
@@ -2,11 +2,18 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
   <PropertyGroup>
     <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{7521B6A2-35C2-4BD4-9304-29FB186638F2}</ProjectGuid>
+    <ProjectGuid>{621C27DA-CC29-4663-9FE4-BF5A67970C18}</ProjectGuid>
+    <SccProjectName>
+    </SccProjectName>
+    <SccLocalPath>
+    </SccLocalPath>
+    <SccProvider>
+    </SccProvider>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
     <AssemblyKeyContainerName>
     </AssemblyKeyContainerName>
     <AssemblyName>pnunit-agent</AssemblyName>
@@ -19,18 +26,20 @@
     <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
     <FileUpgradeFlags>
     </FileUpgradeFlags>
+    <OldToolsVersion>0.0</OldToolsVersion>
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <NoWin32Manifest>true</NoWin32Manifest>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <SccAuxPath>
+    </SccAuxPath>
+    <NoWin32Manifest>true</NoWin32Manifest>
   </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>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -41,14 +50,13 @@
     <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>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -60,60 +68,55 @@
     <ErrorReport>prompt</ErrorReport>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821">
-      <SpecificVersion>False</SpecificVersion>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Runtime.Remoting" />
+    <Reference Include="System.Xml" />
+    <Reference Include="log4net">
       <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>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="agent.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AgentConfig.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PNUnitTestRunner.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
     <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
       <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
+      <Name>nunit.util.dll</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
       <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
+      <Name>nunit.core.dll</Name>
     </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>
+      <Name>nunit.core.interfaces.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>
+      <Name>nunit.framework.dll</Name>
     </ProjectReference>
     <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
       <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" />
+    <None Include="Ship.config" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
diff --git a/src/PNUnit/launcher.log.conf b/src/PNUnit/launcher.log.conf
deleted file mode 100644
index d340cad..0000000
--- a/src/PNUnit/launcher.log.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-<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
index 5ed5f7b..2da8776 100644
--- a/src/PNUnit/launcher/App.config
+++ b/src/PNUnit/launcher/App.config
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 
   <!-- Set the level for tracing NUnit itself -->
diff --git a/src/PNUnit/launcher/Barrier.cs b/src/PNUnit/launcher/Barrier.cs
index 0d8428a..42e4571 100644
--- a/src/PNUnit/launcher/Barrier.cs
+++ b/src/PNUnit/launcher/Barrier.cs
@@ -3,48 +3,57 @@ using System.Threading;
 
 namespace PNUnit.Launcher
 {
-	public class Barrier
-	{
-		private int mCount;
-		private int mMaxCount;
-		private Object mLock = new Object();
+    public class Barrier
+    {
+        public int mCount;
+        public int mMaxCount;
+        private Object mLock = new Object();
+        private string mName;
 
-		public Barrier(int maxCount)
-		{
-			mCount = 0;
-			mMaxCount = maxCount;
+        private static int MAX_WAIT_TIME = 300 * 1000; //milliseconds
 
-		}
+        public Barrier(string name, int maxCount)
+        {
+            mCount = 0;
+            mName = name;
+            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);
-				}
-                
-			}
-		}
-
-	}
+        public void Enter()
+        {
+            lock( mLock )
+            {
+                ++mCount;
+                if( mCount == mMaxCount )
+                {
+                    Monitor.PulseAll(mLock);
+                }
+                else if( mCount < mMaxCount )
+                {
+                    if (!Monitor.Wait(mLock, MAX_WAIT_TIME))
+                    {
+                        Console.WriteLine("Barrier {0} abandoned due to timeout!!!",
+                            mName);
+                    }
+                }
+                else
+                {
+                    //nothing to do, entering in a barrier already used
+                }
+            }
+        }
 
+        public void Abandon()
+        {
+            lock( mLock )
+            {
+                --mMaxCount;
+                if( mCount >= mMaxCount )
+                {
+                    mCount = 0;
+                    Monitor.PulseAll(mLock);
+                }
+            }
+        }
+    }
 }
diff --git a/src/PNUnit/launcher/MessageQueue.cs b/src/PNUnit/launcher/MessageQueue.cs
new file mode 100644
index 0000000..202f6da
--- /dev/null
+++ b/src/PNUnit/launcher/MessageQueue.cs
@@ -0,0 +1,185 @@
+using System;
+using System.Collections;
+using System.Threading;
+
+namespace PNUnit.Launcher
+{
+    public class MessageQueue
+    {
+        private Object mLock = new Object();
+        private ArrayList mMessages = new ArrayList();
+
+        public MessageQueue()
+        {            
+        }
+
+        public void Send(string tag, int receivers, object message)
+        {
+            MessageData msg = null;
+            Monitor.Enter(mLock);
+            try
+            {
+                msg = AddMessage(tag, receivers, message);
+
+                Monitor.PulseAll(mLock);
+            }
+            finally
+            {
+                Monitor.Exit(mLock);
+            }
+
+            msg.WaitForReceptions();
+        }
+
+        public object Receive(string tag)
+        {
+            Monitor.Enter(mLock);
+            try
+            {
+                object msg = null;
+                while ((msg = GetMessage(tag)) == null)
+                {
+                    Monitor.Wait(mLock);
+                }
+                return msg;
+            }
+            finally
+            {
+                Monitor.Exit(mLock);
+            } 
+        }
+
+        public void ISend(string tag, int receivers, object message)
+        {
+            Monitor.Enter(mLock);
+            try
+            {
+               AddMessage(tag, receivers, message);
+               Monitor.PulseAll(mLock);
+            }
+            finally
+            {
+                Monitor.Exit(mLock);
+            } 
+        }
+
+        public object IReceive(string tag)
+        {
+            Monitor.Enter(mLock);
+            try
+            {
+               return GetMessage(tag);
+            }
+            finally
+            {
+                Monitor.Exit(mLock);
+            } 
+        }
+
+        private MessageData AddMessage(string tag, int receivers, object message)
+        {
+            MessageData msg = new MessageData(tag, receivers, message);
+            mMessages.Add(msg);
+
+            return msg;
+        }
+
+        private object GetMessage(string tag)
+        {
+            int index = 0;
+            MessageData msg = null;
+            for (;index< mMessages.Count; index++)
+            {
+                msg = mMessages[index] as MessageData;
+
+                if (!msg.Tag.Equals(tag)) continue;
+
+                msg.ConfirmReception();
+                
+                break;
+            }
+
+            if (msg == null) return null;
+
+            if (!msg.HasPendingReceivers())
+                mMessages.RemoveAt(index);
+
+            return msg.Message;
+        }
+
+        private class MessageData
+        {
+            private object mLock = new object();
+            private string mTag;
+            private int mReceivers;
+            private object mMessage;
+
+            internal MessageData(string tag, int receivers, object message)
+            {
+                this.mTag = tag;
+                this.mReceivers = receivers;
+                this.mMessage = message;
+            }
+
+            internal string Tag
+            {
+                get
+                {
+                    return mTag;
+                }
+            }
+
+            internal object Message
+            {
+                get
+                {
+                    return mMessage;
+                }
+            }
+
+            internal void WaitForReceptions()
+            {
+                Monitor.Enter(mLock);
+                try
+                {                    
+                    while(mReceivers > 0)
+                    {
+                        Monitor.Wait(mLock);
+                    }  
+                }
+                finally
+                {
+                    Monitor.Exit(mLock);
+                }   
+            }
+
+            internal void ConfirmReception()
+            {
+                Monitor.Enter(mLock);
+                try
+                {
+                    mReceivers--;
+                   
+                    Monitor.Pulse(mLock);
+                }
+                finally
+                {
+                    Monitor.Exit(mLock);
+                }
+            }
+
+            internal bool HasPendingReceivers()
+            {
+                Monitor.Enter(mLock);
+                try
+                {
+                    return mReceivers > 0;
+                }
+                finally
+                {
+                    Monitor.Exit(mLock);
+                }
+            }
+        }
+    }    
+}
diff --git a/src/PNUnit/launcher/Runner.cs b/src/PNUnit/launcher/Runner.cs
index 66a8120..75e0aa5 100644
--- a/src/PNUnit/launcher/Runner.cs
+++ b/src/PNUnit/launcher/Runner.cs
@@ -11,270 +11,351 @@ 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;
-			}
-		}*/
+    public class Runner: MarshalByRefObject, IPNUnitServices
+    {
+
+        private static readonly ILog log = LogManager.GetLogger("launcher");
+        private const string agentkey = "_AGENT";
+
+        private int mInitialTime = Environment.TickCount;
+
+        private ParallelTest mTestGroup;
+        private Thread mThread = null;
+        private IList mResults = null;
+        private Object mResultLock = new Object();
+        private ManualResetEvent mFinish;
+        private Hashtable mBarriers;
+        private MessageQueue mMessageQueue = new MessageQueue();
+        private int mLaunchedTests;
+        private Hashtable mBarriersOfTests;
+        private Hashtable mUserValues;
+
+        public Runner(ParallelTest test, Hashtable userValues)
+        {
+            mTestGroup = test;
+            mResults = new ArrayList();
+            mUserValues = userValues;
+        }
+
+        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();
+            init = false;
+            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))];
+
+                Launcher.Log(string.Format("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;
+                    }
+
+                    PNUnitTestInfo testToRun = new PNUnitTestInfo(
+                        test.Name, test.Assembly, test.TestToRun,
+                        test.TestParams, this, test.StartBarrier,
+                        test.EndBarrier, test.WaitBarriers);
+
+                    testToRun.UserValues = mUserValues;
+
+                    agent.RunTest(testToRun);
+                }
+                catch( Exception e )
+                {
+                    Launcher.LogError(string.Format(
+                        "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 TestResult[] GetTestResults()
+        {
+            lock(mResultLock)
+            {
+                TestResult[] result = new TestResult[mResults.Count];
+                int i = 0;
+                foreach( TestResult 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, TestResult result)
+        {
+            log.DebugFormat("NotifyResult called for TestGroup {0}, Test {1}",
+                mTestGroup.Name, TestName);
+
+            int count = 0;
+
+            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();
+                }
+
+                count = mResults.Count;
+            }
+
+            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);
+
+            string machine = GetTestConfFromName(TestName).Machine;
+
+            string message = string.Format(
+                "Result for TestGroup {0}, Test {1}: {2}. Time {3} ms. {4}/{5} tests finished. Agent: {6}",
+                mTestGroup.Name,
+                TestName,
+                result.IsSuccess ? "PASS" : "FAIL",
+                Environment.TickCount - mInitialTime,
+                count,
+                mLaunchedTests,
+                machine);
+
+            if( result.IsSuccess )
+            {
+                Launcher.Log(message);
+                Launcher.WriteTestLog(result, machine, "smoke-result.log");
+            }
+            else
+            {
+                Launcher.LogError(message);
+                Launcher.WriteTestLog(result, machine, "smoke-errors.log");
+            }
+        }
+
+        private TestConf GetTestConfFromName(string testName)
+        {
+            foreach( TestConf testConf in mTestGroup.Tests )
+                if( testConf.Name == testName )
+                    return testConf;
+            return null;
+        }
+
+        private void DoInitBarrier(string barrier, int Max, bool bOverwrite)
+        {
+            lock( mBarriers )
+            {
+                if( !mBarriers.Contains(barrier) || bOverwrite)
+                {
+                    mBarriers[barrier] = new Barrier(barrier, Max);
+                }
+            }
+        }
+
+        private void InitTestBarriers (string testName, string barrier)
+        {
+            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);
+            }
+        }
+
+        private void InitTestBarriers (string testName, string[] barriers)
+        {
+            if (barriers != null && barriers.Length > 0)
+            {
+                foreach (string barrier in barriers)
+                    InitTestBarriers (testName, barrier);
+            }
+        }
+
+        private object sync = new object();
+        private bool init = false;
+        public void InitBarriers ()
+        {
+            log.Debug("InitBarriers invoked");
+            lock (sync)
+            {
+                if (init)
+                    return;
+
+                Hashtable barriers = new Hashtable();
+                for (int i=0; i< mTestGroup.Tests.Length; i++)
+                {
+                    AddBarrier(mTestGroup.Tests[i].StartBarrier, barriers);
+                    AddBarrier(mTestGroup.Tests[i].EndBarrier, barriers);
+                    AddBarrier(mTestGroup.Tests[i].WaitBarriers, barriers);
+
+                    InitTestBarriers (mTestGroup.Tests[i].Name, mTestGroup.Tests[i].StartBarrier);
+                    InitTestBarriers (mTestGroup.Tests[i].Name, mTestGroup.Tests[i].EndBarrier);
+                    InitTestBarriers (mTestGroup.Tests[i].Name, mTestGroup.Tests[i].WaitBarriers);
+                }
+
+                foreach (string key in barriers.Keys)
+                {
+                    DoInitBarrier (key, (int)barriers[key], false);
+                }
+
+                init = true;
+            }
+        }
+
+        public void InitBarrier(string barrier, int max)
+        {
+            DoInitBarrier(barrier, max, true);
+        }
+
+        private void AddBarrier (string barrier, Hashtable barriers)
+        {
+            if (barrier != null && barrier.Trim() != string.Empty)
+            {
+                if(barriers.Contains(barrier))
+                    barriers[barrier] = (int)barriers[barrier]+1;
+                else
+                    barriers[barrier] = 1;
+            }
+        }
+
+        private void AddBarrier(string[] barrier, Hashtable barriers)
+        {
+            if( barrier != null && barrier.Length > 0 )
+            {
+                foreach( string b in barrier )
+                    AddBarrier (b, barriers);
+            }
+        }
+
+        public void EnterBarrier(string barrier)
+        {
+            log.DebugFormat(">Entering Barrier {0}", barrier);
+            ((Barrier)mBarriers[barrier]).Enter();
+            log.DebugFormat("<Entered Barrier {0}", barrier);
+        }
+
+        public void SendMessage(string tag, int receivers, object message)
+        {
+            mMessageQueue.Send(tag, receivers, message);
+        }
+
+        public object ReceiveMessage(string tag)
+        {
+            return mMessageQueue.Receive(tag);
+        }
+
+        public void ISendMessage(string tag, int receivers, object message)
+        {
+            mMessageQueue.ISend(tag, receivers, message);
+        }
+
+        public object IReceiveMessage(string tag)
+        {
+            return mMessageQueue.IReceive(tag);
+        }
+
+        #endregion
+    }
 }
diff --git a/src/PNUnit/launcher/Ship.config b/src/PNUnit/launcher/Ship.config
index 5ed5f7b..2da8776 100644
--- a/src/PNUnit/launcher/Ship.config
+++ b/src/PNUnit/launcher/Ship.config
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="Windows-1252"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 
   <!-- Set the level for tracing NUnit itself -->
diff --git a/src/PNUnit/launcher/TestConf.cs b/src/PNUnit/launcher/TestConf.cs
index b6e2ff2..78a5723 100644
--- a/src/PNUnit/launcher/TestConf.cs
+++ b/src/PNUnit/launcher/TestConf.cs
@@ -1,43 +1,207 @@
 using System;
 using System.IO;
+using System.Collections;
+using System.Reflection;
 using System.Xml.Serialization;
 
+using PNUnit.Framework;
 
 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);
-		}
-	}
+    [Serializable]
+    public class TestGroup
+    {
+        public Variable[] Variables;
+        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 string StartBarrier = Names.ServerBarrier;
+        public string EndBarrier = Names.EndBarrier;
+        public string[] WaitBarriers;
+    }
+
+    public class Variable
+    {
+        [XmlAttribute]
+        public string name;
+
+        [XmlAttribute]
+        public string value;
+
+        public override string ToString()
+        {
+            return string.Format("[{0}]=[{1}]", this.name, this.value);
+        }
+    }
+
+    public class TestConfLoader
+    {
+        public static TestGroup LoadFromFile(string file, string[] args)
+        {
+            FileStream reader = new FileStream(file, FileMode.Open, FileAccess.Read);
+            try
+            {
+                XmlSerializer ser = new XmlSerializer(typeof(TestGroup));
+                
+                TestGroup result = (TestGroup)ser.Deserialize(reader);
+
+                Variable[] processedVars = ParseVariablesFromCommandLine(args, result.Variables);
+                
+                ReplaceVariables(result.ParallelTests, processedVars);
+
+                return result;
+            }
+            finally
+            {
+                reader.Close();
+            }
+        }
+
+        public static void WriteToFile(TestGroup group, string file)
+        {
+            FileStream writer = new FileStream(file, FileMode.Create, FileAccess.Write);
+            try
+            {
+                XmlSerializer ser = new XmlSerializer(typeof(TestGroup));
+                ser.Serialize(writer, group);
+            }
+            finally
+            {
+                writer.Close();
+            }
+        }
+
+        // Variable replacement
+
+        private static void ReplaceVariables(ParallelTest[] target, Variable[] variables)
+        {
+            if (variables == null || target == null) return;
+
+            foreach (Variable var in variables)
+                foreach (ParallelTest test in target) 
+                    ReplaceVariableOnTest(test, var);
+        }
+
+        private static void ReplaceVariableOnTest(ParallelTest t, Variable var)
+        {
+            t.Agents = ReplaceVarArray(t.Agents, var);
+            t.Name = ReplaceVar (t.Name, var);
+
+            foreach (TestConf tc in t.Tests)
+            {
+                tc.Name = ReplaceVar(tc.Name, var);
+                tc.Assembly = ReplaceVar(tc.Assembly, var);
+                tc.TestToRun = ReplaceVar(tc.TestToRun, var);
+                tc.Machine = ReplaceVar(tc.Machine, var);
+                tc.TestParams = ReplaceVarArray(tc.TestParams, var);
+                tc.StartBarrier = ReplaceVar(tc.StartBarrier, var);
+                tc.EndBarrier = ReplaceVar(tc.EndBarrier, var);
+                tc.WaitBarriers = ReplaceVarArray(tc.WaitBarriers, var);
+            }
+        }
+
+        private static string[] ReplaceVarArray(string[] source, Variable var)
+        {
+            if (source == null) return null;
+
+            for (int i = 0; i < source.Length; ++i)
+            {
+                source[i] = ReplaceVar(source[i], var);
+            }
+
+            return source;
+        }
+
+        private static string ReplaceVar(string source, Variable var)
+        {
+            if (source == null) return null;
+
+            return source.Replace(var.name, var.value);
+        }
+
+        // Command line variable handling
+
+        private static Variable[] ParseVariablesFromCommandLine(
+            string[] args, Variable[] variables)
+        {
+            // variables from the command line, if defined, are prefixed with "-D:"
+
+            if (args == null) return variables;
+
+            IDictionary varsFromCli = ParseCliVars(args);
+
+            if (varsFromCli == null) return variables;
+
+            return MergeVars(varsFromCli, variables);
+        }
+
+        private static IDictionary ParseCliVars(string[] args)
+        {
+            Hashtable result = new Hashtable();
+
+            foreach (string s in args)
+            {
+                if (s.StartsWith("-D:") || s.StartsWith("-d:"))
+                {
+                    Variable var = new Variable();
+
+                    string[] v = s.Substring(3).Split('=');
+
+                    if (v.Length >= 1)
+                    {
+                        var.name = v[0];
+
+                        if (v.Length == 2) var.value = v[1];
+
+                        result[var.name] = var;
+                    }
+                }
+            }
+
+            return (result.Count > 0) ? result: null;
+        }
+
+        private static Variable[] MergeVars(IDictionary overrides, IList originals)
+        {
+            ArrayList result = new ArrayList();
+
+            if( originals != null )
+            {
+                foreach( Variable v in originals )
+                {
+                    Variable ovr = overrides[v.name] as Variable;
+
+                    if( ovr != null )
+                    {
+                        v.value = ovr.value;
+                        overrides.Remove(v.name);
+                    }
+
+                    result.Add(v);
+                }
+            }
+
+            foreach( Variable v in overrides.Values ) result.Add(v);
+
+            return result.ToArray(typeof(Variable)) as Variable[];
+        }
+    }
 
 }
diff --git a/src/PNUnit/launcher/launcher.cs b/src/PNUnit/launcher/launcher.cs
index e79de7f..7e42e41 100644
--- a/src/PNUnit/launcher/launcher.cs
+++ b/src/PNUnit/launcher/launcher.cs
@@ -16,148 +16,535 @@ 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
+    class Launcher
+    {
+        private static readonly ILog log = LogManager.GetLogger("launcher");
+
+        static string mTestPath = string.Empty;
+        static string mTotalLog = string.Empty;
+
+        private static int MAX_TEST_RETRY = 3;
+
+        [STAThread]
+        static void Main(string[] args)
+        {
+            string resultfile = null;
+            string failedfile = null;
+            string passedfile = null;
+
+            int retryOnFailure = 0;
+            int maxRetry = MAX_TEST_RETRY;
+
+            ConfigureLogging();
+
+            try
+            {
+                // Load the test configuration file
+                if( args.Length == 0 )
+                {
+                    Console.WriteLine(
+                        "Usage: launcher configfile [--result=filename] [--failed=filename] [-D:var=value] [-val:variable=value] [--retry=number] [--range=from-to] [--test=testname]");
+                    return;
+                }
+
+                string configfile = args[0];
+
+                mTestPath = Path.GetDirectoryName(configfile);
+                TestGroup group = TestConfLoader.LoadFromFile(configfile, args);
+
+                int startTest = 0;
+                int endTest = group.ParallelTests.Length - 1;
+
+                failedfile = Path.Combine(mTestPath, "smokefailed.conf");
+                passedfile = Path.Combine(mTestPath, "smokepassed.conf");
+
+                if( args.Length > 1 )
+                {
+                    foreach( string arg in args )
+                    {
+                        if( arg.StartsWith("--result=") )
+                        {
+                            resultfile = arg.Substring(9);
+                            resultfile = Path.GetFullPath(resultfile);
+                        }
+
+                        if( arg.StartsWith("--failed=") )
+                        {
+                            failedfile = arg.Substring(9);
+                            failedfile = Path.GetFullPath(failedfile);
+                        }
+
+                        if( arg.StartsWith("--retry=") )
+                        {
+                            retryOnFailure = int.Parse(arg.Substring("--retry=".Length));
+                            log.InfoFormat("Retry on failure activated. {0} retries", retryOnFailure);
+                            maxRetry = retryOnFailure;
+                        }
+
+                        if(arg.StartsWith("--test="))
+                        {
+                            string testName = arg.Substring("--test=".Length);
+                            int index = -1;
+                            for(int i=0; i< group.ParallelTests.Length; i++)
+                            {
+                                if(group.ParallelTests[i].Name != testName)
+                                    continue;
+
+                                index = i;
+                                break;
+                            }
+
+                            if(index == -1)
+                            {
+                                Console.WriteLine("The specified test was not found");
+                                return;
+                            }
+
+                            startTest = index;
+                            endTest = index;
+                        }
+
+                        if( arg.StartsWith("--range=") )
+                        {
+                            string range = arg.Substring("--range=".Length);
+                            // now range should be something like xx-xx
+                            if( range.IndexOf("-") < 0 )
+                            {
+                                Console.WriteLine("Test range incorrectly specified, it must be something like 0-10");
+                                return;
+                            }
+                            string[] ranges = range.Split('-');
+                            if( ranges.Length != 2 )
+                            {
+                                Console.WriteLine("Test range incorrectly specified, it must be something like 0-10");
+                                return;
+                            }
+
+                            startTest = int.Parse(ranges[0]);
+                            endTest = int.Parse(ranges[1]);
+
+                            if( (startTest > endTest) ||
+                                (startTest < 0) || 
+                                (startTest > group.ParallelTests.Length - 1) )
+                            {
+                                Console.WriteLine("Start test must be in a correct test range");
+                                return;
+                            }
+
+                            if( (endTest < startTest) ||
+                                (endTest < 0) || 
+                                (endTest > group.ParallelTests.Length - 1) )
+                            {
+                                Console.WriteLine("End test must be in a correct test range");
+                                return;
+                            }
+
+                            log.InfoFormat("Starting test range [{0}-{1}]", startTest, endTest);
+                        }
+                    }
+                }
+
+                if( (group == null) || (group.ParallelTests.Length == 0) )
+                {
+                    Console.WriteLine("No tests to run");
+                    return;
+                }
+
+                Hashtable userValues = GetUserValues(args);
+
+                ConfigureRemoting();
+
+                ArrayList failedGroups = new ArrayList();
+                ArrayList passedGroups = new ArrayList();
+
+                int testCount = endTest - startTest + 1;
+
+                // Each parallel test is launched sequencially...
+                Runner[] runners = new Runner[testCount];
+
+                DateTime beginTimestamp = DateTime.Now;
+                for( int i = startTest; i <= endTest; )
+                {
+                    ParallelTest test = group.ParallelTests[i] as ParallelTest;
+
+                    int retryCount = 0;
+
+                    bool bRetry = true;
+
+                    while( bRetry && retryCount < maxRetry )
+                    {
+                        bRetry = false;
+
+                        if( testCount != group.ParallelTests.Length )
+                            log.InfoFormat("Test {0} of {1}. {2}/{3}",
+                                i, group.ParallelTests.Length, i-startTest+1,
+                                testCount);
+                        else
+                            log.InfoFormat("Test {0} of {1}", i+1,
+                                group.ParallelTests.Length);
+
+                        Runner runner = new Runner(test, userValues);
+                        runner.Run();
+
+                        runners[i-startTest] = runner;
+                        // Wait to finish
+                        runner.Join();
+
+                        TestResult[] runnerResults = runner.GetTestResults();
+
+                        if( runnerResults == null )
+                        {
+                            log.Info("Error. Results are NULL");
+
+                            ++i;
+                            continue;
+                        }
+
+                        bRetry = RetryTest(runnerResults);
+                        bool bFailed = FailedTest(runnerResults);
+
+                        if( bRetry ||
+                            ((bFailed && (retryOnFailure > 0) &&
+                             ((retryCount + 1) < maxRetry ) ) /* so that list time is printed*/) )
+                        {
+                            bRetry = true;
+                            ++retryCount;
+                            log.Info("Test failed with retry option, trying again");
+                            continue;
+                        }
+
+                        if( bFailed )
+                        {
+                            failedGroups.Add(test);
+                            WriteGroup(failedGroups, failedfile);
+                        }
+                        else
+                        {
+                            passedGroups.Add(test);
+                            WriteGroup(passedGroups, passedfile);
+                        }
+                    }
+
+                    // updated at the bottom so it's not affected by retries
+                    ++i;
+                }
+                DateTime endTimestamp = DateTime.Now;
+
+                // Print the results
+                double TotalBiggerTime = 0;
+                int TotalTests = 0;
+                int TotalExecutedTests = 0;
+                int TotalFailedTests = 0;
+                int TotalSuccessTests = 0;
+
+                IList failedTests = new ArrayList();
+
+                int j;
+                foreach( Runner runner in runners )
+                {
+                    int ExecutedTests = 0;
+                    int FailedTests = 0;
+                    int SuccessTests = 0;
+                    double BiggerTime = 0;
+                    TestResult[] results = runner.GetTestResults();
+                    Log(string.Format("==== Tests Results for Parallel TestGroup {0} ===", runner.TestGroupName));
+                    j = 0;
+                    foreach( TestResult res in results )
+                    {
+                        if( res.Executed )
+                            ++ExecutedTests;
+                        if( res.IsFailure )
+                            ++FailedTests;
+                        if( res.IsSuccess )
+                            ++SuccessTests;
+
+                        PrintResult(++j, res);
+                        if( res.Time > BiggerTime )
+                            BiggerTime = res.Time;
+
+                        if( res.IsFailure )
+                            failedTests.Add(res);
+                    }
+
+                    Log("Summary:");
+                    Log(string.Format("\tTotal: {0}\r\n\tExecuted: {1}\r\n\tFailed: {2}\r\n\tSuccess: {3}\r\n\t% Success: {4}\r\n\tBiggest Execution Time: {5} s\r\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;
+                }
+
+                // print all failed tests together
+                if( failedTests.Count > 0 )
+                {
+                    Log("==== Failed tests ===");
+                    for( j = 0; j < failedTests.Count; ++j )
+                        PrintResult(j, failedTests[j] as PNUnitTestResult);
+                }
+
+                if( runners.Length > 1 )
+                {
+
+                    Log("Summary for all the parallel tests:");
+                    Log(string.Format("\tTotal: {0}\r\n\tExecuted: {1}\r\n\tFailed: {2}\r\n\tSuccess: {3}\r\n\t% Success: {4}\r\n\tBiggest Execution Time: {5} s\r\n",
+                        TotalTests, TotalExecutedTests, TotalFailedTests, TotalSuccessTests,
+                        TotalTests > 0 ? 100 * TotalSuccessTests / TotalTests : 0,
+                        TotalBiggerTime));
+                }
+
+                TimeSpan elapsedTime = endTimestamp.Subtract(beginTimestamp);
+                Log(string.Format("Launcher execution time: {0} seconds", elapsedTime.TotalSeconds));
+            }
+            finally
+            {
+                WriteResult(resultfile);
+            }
+        }
+
+        private static bool FailedTest(TestResult[] results)
+        {
+            foreach( TestResult res in results )
+            {
+                if (res == null)
+                    continue;
+                if( !res.IsSuccess )
+                    return true;
+            }
+            return false;
+        }
+
+        private static bool RetryTest(TestResult[] results)
+        {
+            foreach(TestResult res in results)
+            {
+                if (res == null)
+                    continue;
+                if (res is PNUnitTestResult)
+                {
+                    return ((PNUnitTestResult)res).RetryTest;
+                }
+            }
+            return false;
+        }
+
+        private static void ConfigureRemoting()
+        {
+            if( File.Exists("launcher.remoting.conf") )
+            {
+                log.InfoFormat("Using launcher.remoting.conf");
+#if CLR_2_0 || CLR_4_0
+                RemotingConfiguration.Configure("launcher.remoting.conf", false);
+#else
+                RemotingConfiguration.Configure("launcher.remoting.conf");
+#endif
+                return;
+            }
+
+            BinaryClientFormatterSinkProvider clientProvider = null;
+            BinaryServerFormatterSinkProvider serverProvider =
+                new BinaryServerFormatterSinkProvider();
+            serverProvider.TypeFilterLevel =
+                System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
+
+            IDictionary props = new Hashtable();
+            props["port"] = 0;
+            props["typeFilterLevel"] = TypeFilterLevel.Full;
+            TcpChannel chan = new TcpChannel(
+                props,clientProvider,serverProvider);
+
+#if CLR_2_0 || CLR_4_0
             ChannelServices.RegisterChannel(chan, false);
 #else
-			ChannelServices.RegisterChannel(chan);
+            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 PrintResult(int testNumber, TestResult res)
+        {
+            string[] messages = GetErrorMessages(res);
+            Log(string.Format("({0}) {1}", testNumber, messages[0]));
+            if( !res.IsSuccess )
+                Log(messages[1]);
+        }
+
+        private static string[] GetErrorMessages(TestResult res)
+        {
+            string[] result = new string[2];
+
+            result[0] = string.Format(
+                "Name: {0}\n  Result: {1,-12} Assert Count: {2,-2} Time: {3,5}",
+                res.Name,
+                res.IsSuccess ? "SUCCESS" : (res.IsFailure ? "FAILURE" : (! res.Executed ? "NOT EXECUTED": "UNKNOWN")),
+                res.AssertCount,
+                res.Time);
+
+            if( !res.IsSuccess )
+                result[1] = string.Format(
+                    "\nMessage: {0}\nStack Trace:\n{1}\r\n\r\n",
+                        res.Message, res.StackTrace);
+
+            return result;
+        }
+
+        private static object mWriteTestLogLock = new object();
+        internal static void WriteTestLog(
+            TestResult result,
+            string machine,
+            string fileName)
+        {
+            if( result == null )
+                return;
+
+            lock( mWriteTestLogLock )
+                DoWriteTestLog(result, machine, fileName);
+        }
+
+        private static void DoWriteTestLog(
+            TestResult result,
+            string machine,
+            string fileName)
+        {
+            FileStream fs = null;
+            StreamWriter writer = null;
+
+            try
+            {
+                fs = new FileStream(
+                    Path.Combine(mTestPath, fileName),
+                    FileMode.OpenOrCreate,
+                    FileAccess.ReadWrite);
+
+                fs.Seek(0, SeekOrigin.End);
+                writer = new StreamWriter(fs);
+
+                writer.WriteLine("==============================================================");
+
+                if( result.IsFailure )
+                {
+                    writer.WriteLine("Errors for test [{0}] run at agent [{1}]",
+                        result.Name, machine);
 
-		}
+                    string[] messages = GetErrorMessages(result);
 
-		private static void ConfigureLogging()
-		{
-			string log4netpath = "launcher.log.conf";
-			XmlConfigurator.Configure(new FileInfo(log4netpath));
-		}
+                    writer.WriteLine(messages[0]);
+                    writer.WriteLine(messages[1]);
+                }
+                else
+                {
+                    writer.WriteLine("Log for test [{0}] run at agent [{1}]",
+                        result.Name, machine);
+                }
 
+                writer.WriteLine("\nOutput:");
+                if( result is PNUnitTestResult )
+                {
+                    writer.Write(((PNUnitTestResult)result).Output);
+                }
+            }
+            catch( Exception e )
+            {
+                log.ErrorFormat("Error writing to {0}. {1}",
+                    fileName, e.Message);
+            }
+            finally
+            {
+                if( writer != null )
+                {
+                    writer.Flush();
+                    writer.Close();
+                }
 
-	}
-}
+                if( fs != null )
+                    fs.Close();
+            }
+        }
+
+        private static void WriteResult(string resultfile)
+        {
+            if (resultfile == null || resultfile == string.Empty)
+                return;
+
+            if (File.Exists(resultfile))
+            {
+                File.Delete(resultfile);
+            }
+
+            FileStream fs = new FileStream(resultfile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
+            StreamWriter writer = new StreamWriter(fs);
+
+            try
+            {
+                writer.Write(mTotalLog);
+
+            }
+            finally
+            {
+                writer.Flush();
+                writer.Close();
+                fs.Close();
+            }
+        }
+
+        private static void WriteGroup(ArrayList failedTests, string filename)
+        {
+            TestGroup group = new TestGroup();
+            group.ParallelTests = (ParallelTest[]) failedTests.ToArray(typeof(ParallelTest));
+            TestConfLoader.WriteToFile(group, filename);
+        }
+
+        private static void ConfigureLogging()
+        {
+            string log4netpath = "launcher.log.conf";
+            if (!File.Exists (log4netpath))
+                log4netpath = Path.Combine(mTestPath, log4netpath);
+
+            XmlConfigurator.Configure(new FileInfo(log4netpath));
+        }
+
+        public static void Log(string msg)
+        {
+            log.Info(msg);
+            mTotalLog += string.Concat(msg, "\r\n");
+        }
+
+        public static void LogError(string msg)
+        {
+            log.Error(msg);
+            mTotalLog += string.Concat(msg, "\r\n");
+        }
+
+        private const string USER_VALUE_KEY = "-val:";
+
+        private static Hashtable GetUserValues(string[] args)
+        {
+            Hashtable result = new Hashtable();
+
+            foreach( string s in args )
+            {
+                if( !s.ToLower().StartsWith(USER_VALUE_KEY) )
+                    continue;
+
+                string[] v = s.Substring(USER_VALUE_KEY.Length).Split('=');
+
+                if( v.Length >= 1 )
+                {
+                    string name = v[0];
+                    string val = string.Empty;
+
+                    if( v.Length == 2 )
+                        val = v[1];
+
+                    result.Add(name, val);
+                }
+            }
+
+            return result;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/PNUnit/launcher/pnunit-launcher.build b/src/PNUnit/launcher/pnunit-launcher.build
index f1e1792..91305fa 100644
--- a/src/PNUnit/launcher/pnunit-launcher.build
+++ b/src/PNUnit/launcher/pnunit-launcher.build
@@ -5,6 +5,7 @@
         <include name="AssemblyInfo.cs"/>
         <include name="Barrier.cs"/>
         <include name="launcher.cs"/>
+	<include name="MessageQueue.cs"/>
         <include name="Runner.cs"/>
         <include name="TestConf.cs"/>
   </patternset>
@@ -13,7 +14,7 @@
     <csc target="exe"
         output="${current.build.dir}/pnunit-launcher.exe"
         debug="${build.debug}" 
-        define="${build.defines};NUNIT_2_5">
+        define="${build.defines}">
       <sources basedir=".">
         <patternset refid="source-files"/>
       </sources>
diff --git a/src/PNUnit/launcher/pnunit-launcher.csproj b/src/PNUnit/launcher/pnunit-launcher.csproj
index 452547f..6605834 100644
--- a/src/PNUnit/launcher/pnunit-launcher.csproj
+++ b/src/PNUnit/launcher/pnunit-launcher.csproj
@@ -2,11 +2,20 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
   <PropertyGroup>
     <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{5E0C72D1-A2A5-4836-BB97-57FF91055B64}</ProjectGuid>
+    <ProjectGuid>{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}</ProjectGuid>
+    <SccProjectName>
+    </SccProjectName>
+    <SccLocalPath>
+    </SccLocalPath>
+    <SccAuxPath>
+    </SccAuxPath>
+    <SccProvider>
+    </SccProvider>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>App.ico</ApplicationIcon>
     <AssemblyKeyContainerName>
     </AssemblyKeyContainerName>
     <AssemblyName>pnunit-launcher</AssemblyName>
@@ -19,18 +28,18 @@
     <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
     <FileUpgradeFlags>
     </FileUpgradeFlags>
+    <OldToolsVersion>0.0</OldToolsVersion>
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <NoWin32Manifest>true</NoWin32Manifest>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
   </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>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -47,7 +56,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0;NUNIT_2_5</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -59,56 +68,57 @@
     <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>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Runtime.Remoting" />
+    <Reference Include="System.Xml" />
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Name>nunit.util.dll</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
       <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
+      <Name>nunit.core.dll</Name>
     </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>
+      <Name>nunit.core.interfaces.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>
+      <Name>nunit.framework.dll</Name>
     </ProjectReference>
     <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
       <Name>pnunit.framework</Name>
-      <Project>{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}</Project>
-      <Private>False</Private>
     </ProjectReference>
+    <Reference Include="log4net">
+      <HintPath>..\..\..\lib\log4net.dll</HintPath>
+    </Reference>
   </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" />
+    <Content Include="App.ico" />
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Barrier.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="launcher.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MessageQueue.cs" />
+    <Compile Include="Runner.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="TestConf.cs">
+      <SubType>Code</SubType>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
-    <Content Include="App.ico" />
+    <None Include="App.config" />
+    <None Include="pnunit-launcher.build" />
+    <None Include="Ship.config" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
diff --git a/src/PNUnit/pnunit.framework/Interfaces.cs b/src/PNUnit/pnunit.framework/Interfaces.cs
index 702e94f..87dda7a 100644
--- a/src/PNUnit/pnunit.framework/Interfaces.cs
+++ b/src/PNUnit/pnunit.framework/Interfaces.cs
@@ -1,110 +1,147 @@
 using System;
+using System.Collections;
+using System.Runtime.Serialization;
 
 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 const string RestartBarrier = "SERVERRESTART";
+        public const string RestartedOkBarrier = "SERVERRESTARTEDOK";
+    }
+
+    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, TestResult result);
+
+        void InitBarriers();
+
+        void InitBarrier(string name, int max);
+
+        void EnterBarrier(string barrier);
+
+        void SendMessage(string tag, int receivers, object message);
+
+        object ReceiveMessage(string tag);
+
+        void ISendMessage(string tag, int receivers, object message);
+
+        object IReceiveMessage(string tag);
+    }
+
+    [Serializable]
+    public class PNUnitTestInfo
+    {
+        public string TestName;
+        public string AssemblyName;
+        public string TestToRun;
+        public string[] TestParams;
+        public IPNUnitServices Services;
+        public string StartBarrier;
+        public string EndBarrier;
+        public string[] WaitBarriers;
+        public Hashtable UserValues = new Hashtable();
+
+        public PNUnitTestInfo(
+            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 PNUnitTestInfo(
+            string TestName, string AssemblyName,
+            string TestToRun, string[] TestParams,
+            IPNUnitServices Services,
+            string StartBarrier, string EndBarrier, string[] WaitBarriers)
+        {
+            this.TestName = TestName;
+            this.AssemblyName = AssemblyName;
+            this.TestToRun = TestToRun;
+            this.TestParams = TestParams;
+            this.Services = Services;
+            this.StartBarrier = StartBarrier;
+            this.EndBarrier = EndBarrier;
+            this.WaitBarriers = WaitBarriers;
+        }
+    }
+
+    public interface IPNUnitAgent
+    {
+        void RunTest(PNUnitTestInfo info);
+    }
+
+    [Serializable]
+    public class PNUnitRetryException : Exception
+    {
+        public static string RETRY_EXCEPTION = "RETRY_EXCEPTION:";
+        #region "constructors"
+        public PNUnitRetryException(string message)
+            : base(RETRY_EXCEPTION + message)
+        {
+        }
+
+        public PNUnitRetryException(string message, Exception innerException)
+            : base(RETRY_EXCEPTION + message, innerException)
+        {
+        }
+
+        public PNUnitRetryException(SerializationInfo info, StreamingContext context)
+            : base(info, context)
+        {
+        }
+        #endregion
+    }
+
+    [Serializable]
+    public class PNUnitTestResult : TestResult
+    {
+        private string mOutput = string.Empty;
+        private bool mRetryTest = false;
+
+        public PNUnitTestResult(TestName testName, string output)
+            : base(testName)
+        {
+            mOutput = output;
+        }
+
+        public PNUnitTestResult(TestResult testResult, string output): base(testResult.Test)
+        {
+            mOutput = output;
+            if (testResult.Message != null && (testResult.Message.IndexOf(PNUnitRetryException.RETRY_EXCEPTION) >= 0))
+                this.mRetryTest = true;
+
+            if (testResult.IsSuccess)
+                this.Success(testResult.Message);
+            else
+                this.Failure(testResult.Message, testResult.StackTrace);
+            this.Time = testResult.Time;
+        }
+
+        public string Output { get { return mOutput; } }
+        public bool RetryTest { get { return mRetryTest; } }
+    }
 
-	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
index 1024330..ab469ae 100644
--- a/src/PNUnit/pnunit.framework/PNUnitServices.cs
+++ b/src/PNUnit/pnunit.framework/PNUnitServices.cs
@@ -2,98 +2,179 @@ 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);
-		}
+    [Serializable]
+    public class PNUnitServices
+    {
+        private PNUnitTestInfo 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 PNUnitTestInfo;
+            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();
+        }
         
-		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);
-		}
-
-	}
+        public void InitBarrier(string name, int max)
+        {
+            CheckInfo();
+            mInfo.Services.InitBarrier(name, 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 void SendMessage(string tag, int receivers, object message)
+        {
+            CheckInfo();
+            mConsole.WriteLine(
+                string.Format(
+                ">>>Message sending (tag:{1} receivers:{2} message:{3}) by test {0} ", 
+                mInfo.TestName, tag, receivers, 
+                message == null ? string.Empty : message.ToString()));
+            mInfo.Services.SendMessage(tag, receivers, message);
+            mConsole.WriteLine(
+                string.Format(
+                "<<<Message send (tag:{1} receivers:{2} message:{3}) by test {0} & all receivers confirm reception", 
+                mInfo.TestName, tag, receivers, 
+                message == null ? string.Empty : message.ToString()));
+        }
+
+        public object ReceiveMessage(string tag)
+        {
+            CheckInfo();
+            mConsole.WriteLine(
+                string.Format(">>>Receiving message (tag:{1}) by test {0}", 
+                mInfo.TestName, tag));
+            object message = mInfo.Services.ReceiveMessage(tag);
+            mConsole.WriteLine(
+                string.Format("<<<Received message (tag:{1} message:{2}) by test {0}", 
+                mInfo.TestName, tag, message.ToString()));
+            return message;
+        }
+
+        public void ISendMessage(string tag, int receivers, object message)
+        {
+            CheckInfo();
+            CheckInfo();
+            mConsole.WriteLine(
+                string.Format(
+                ">>>Message sending (tag:{1} message:{2}) by test {0} ", 
+                mInfo.TestName, tag, 
+                message == null ? string.Empty : message.ToString()));
+            mInfo.Services.ISendMessage(tag, receivers, message);
+            mConsole.WriteLine(
+                string.Format(
+                "<<<Message sent (tag:{1} message:{2}) by test {0} & all receivers confirm reception", 
+                mInfo.TestName, tag, 
+                message == null ? string.Empty : message.ToString()));
+        }
+
+        public object IReceiveMessage(string tag)
+        {
+            CheckInfo();
+            mConsole.WriteLine(
+                string.Format(">>>Looking for message (tag:{1}) by test {0}", 
+                mInfo.TestName, tag));
+            object msg = mInfo.Services.IReceiveMessage(tag);
+            mConsole.WriteLine(
+                string.Format("<<<Search for message (tag{1}) by test {0}", 
+                mInfo.TestName, tag));
+            return msg;
+        }
+
+        public string[] GetTestWaitBarriers()
+        {
+            CheckInfo();
+            return mInfo.WaitBarriers;
+        }
+
+        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);
+        }
+
+        public string GetTestStartBarrier()
+        {
+            CheckInfo();
+            if (mInfo.StartBarrier == null || mInfo.StartBarrier == string.Empty)
+                mInfo.StartBarrier = Names.ServerBarrier;
+            return mInfo.StartBarrier;
+        }
+
+        public string GetTestEndBarrier()
+        {
+            CheckInfo();
+            if (mInfo.EndBarrier == null || mInfo.EndBarrier == string.Empty)
+                mInfo.EndBarrier = Names.EndBarrier;
+            return mInfo.EndBarrier;
+        }
+
+        public string GetUserValue(string key)
+        {
+            if( mInfo == null || mInfo.UserValues == null )
+                return string.Empty;
 
+            return (string) mInfo.UserValues[key];
+        }
+    }
 }
diff --git a/src/PNUnit/pnunit.framework/pnunit.framework.build b/src/PNUnit/pnunit.framework/pnunit.framework.build
index 263abe5..4e7096e 100644
--- a/src/PNUnit/pnunit.framework/pnunit.framework.build
+++ b/src/PNUnit/pnunit.framework/pnunit.framework.build
@@ -12,7 +12,7 @@
     <csc target="library"
         output="${current.framework.dir}/pnunit.framework.dll"
         debug="${build.debug}" 
-        define="${build.defines};NUNIT_2_5">
+        define="${build.defines}">
       <sources basedir=".">
         <patternset refid="source-files"/>
       </sources>
diff --git a/src/PNUnit/pnunit.framework/pnunit.framework.csproj b/src/PNUnit/pnunit.framework/pnunit.framework.csproj
index c85efe0..5b8d9e3 100644
--- a/src/PNUnit/pnunit.framework/pnunit.framework.csproj
+++ b/src/PNUnit/pnunit.framework/pnunit.framework.csproj
@@ -1,10 +1,16 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
+    <ProjectGuid>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</ProjectGuid>
+    <SccProjectName>
+    </SccProjectName>
+    <SccLocalPath>
+    </SccLocalPath>
+    <SccProvider>
+    </SccProvider>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <AssemblyKeyContainerName>
@@ -19,17 +25,19 @@
     <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
     <FileUpgradeFlags>
     </FileUpgradeFlags>
+    <OldToolsVersion>0.0</OldToolsVersion>
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <SccAuxPath>
+    </SccAuxPath>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NUNIT_2_5</DefineConstants>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -42,11 +50,11 @@
     <ErrorReport>prompt</ErrorReport>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NUNIT_2_5</DefineConstants>
+    <DefineConstants>TRACE</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -58,30 +66,38 @@
     <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>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Interfaces.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="PNUnitServices.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Name>nunit.util.dll</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
       <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
+      <Name>nunit.core.dll</Name>
     </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>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
     </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="Interfaces.cs" />
-    <Compile Include="PNUnitServices.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="pnunit.framework.build" />
diff --git a/src/PNUnit/runpnunit.bat b/src/PNUnit/runpnunit.bat
deleted file mode 100644
index 6efc8b4..0000000
--- a/src/PNUnit/runpnunit.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index a35e718..0000000
--- a/src/PNUnit/test.conf
+++ /dev/null
@@ -1,24 +0,0 @@
-<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/ParallelExamples.cs b/src/PNUnit/tests/ParallelExamples.cs
new file mode 100644
index 0000000..a1b00f5
--- /dev/null
+++ b/src/PNUnit/tests/ParallelExamples.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Diagnostics;
+using System.Threading;
+
+
+using NUnit.Framework;
+using PNUnit.Framework;
+
+namespace TestLibraries
+{
+    [TestFixture, Explicit("PNUnit Test")]
+    //TestGroup that runs their tests without any synchronization. Each test runs in parallel
+    public class ParallelExample
+    {
+        private const int MAX_ITERATIONS = 5;
+        [Test]
+        public void ParallelTest_A()
+        {
+            //Obtain the sleep time from the configuration file parameters
+            string[] testParams = PNUnitServices.Get().GetTestParams();
+            int sleepTime = int.Parse(testParams[0]);
+
+            int count = 0;
+            while (count < MAX_ITERATIONS)
+            {
+                PNUnitServices.Get().WriteLine(
+                    string.Format("Starting  ParallelTest_A, Time: {0}. Iteration:{1}",
+                        DateTime.Now.ToString(),
+                        count + 1));
+
+                PNUnitServices.Get().WriteLine(
+                    string.Format("Sleeping  ParallelTest_A for {1} seconds, Time: {0}", 
+                        DateTime.Now.ToString(),
+                        sleepTime));
+
+                Thread.Sleep(sleepTime * 1000);
+
+                PNUnitServices.Get().WriteLine(
+                    string.Format("Waking up ParallelTest_A, Time: {0}", 
+                    DateTime.Now.ToString()));
+                
+                count++;
+            }
+        }
+
+        [Test]
+        public void ParallelTest_B()
+        {
+            string[] testParams = PNUnitServices.Get().GetTestParams();
+            int sleepTime = int.Parse(testParams[0]);
+
+            int count = 0;
+            while (count < MAX_ITERATIONS)
+            {
+                PNUnitServices.Get().WriteLine(
+                    string.Format("Starting  ParallelTest_B, Time: {0}. Iteration:{1}",
+                    DateTime.Now.ToString(),
+                    count + 1));
+
+                PNUnitServices.Get().WriteLine(
+                    string.Format("Sleeping  ParallelTest_B for {1} seconds, Time: {0}", 
+                    DateTime.Now.ToString(),
+                    sleepTime));
+
+                Thread.Sleep(sleepTime * 1000);
+
+                PNUnitServices.Get().WriteLine(
+                    string.Format("Waking up ParallelTest_B, Time: {0}", 
+                    DateTime.Now.ToString()));
+                
+                count++;
+            }
+        }
+    }
+
+    [TestFixture, Explicit("PNUnit Test")]
+    public class ParallelExampleWithBarriers
+    {        
+        public const string START_BARRIER = "START_BARRIER";
+        public const string WAIT_BARRIER  = "WAIT_BARRIER";
+
+        [Test]
+        public void ParallelTestWithBarriersA()
+        {
+            //First step should be the initialization of synchronization barriers
+            PNUnitServices.Get().InitBarriers();
+
+            PNUnitServices.Get().WriteLine(
+                string.Format(
+                    "ParallelTestWithBarriersA: Waiting for peer synchronization before starting... Time:{0}", 
+                    DateTime.Now.ToString()));
+
+            PNUnitServices.Get().EnterBarrier(START_BARRIER);
+            PNUnitServices.Get().WriteLine(string.Format(
+                "ParallelTestWithBarriersA: Sync start performed!... Time:{0}", DateTime.Now.ToString()));
+
+            PNUnitServices.Get().WriteLine(
+                string.Format("Sleeping  ParallelTestWithBarriersA for 5 seconds, Time: {0}", 
+                DateTime.Now.ToString()));
+
+            Thread.Sleep(5000);
+
+            PNUnitServices.Get().WriteLine(
+                string.Format(
+                "ParallelTestWithBarriersA: Waiting for peer synchronization after sleeping... Time:{0}", 
+                DateTime.Now.ToString()));
+
+            PNUnitServices.Get().EnterBarrier(WAIT_BARRIER);
+            PNUnitServices.Get().WriteLine(string.Format("ParallelTestWithBarriersA: Sync end!. Time:{0}", DateTime.Now.ToString()));
+        }
+
+        [Test]
+        public void ParallelTestWithBarriersB()
+        {
+            PNUnitServices.Get().InitBarriers();
+
+            PNUnitServices.Get().WriteLine(
+                string.Format(
+                "ParallelTestWithBarriersB: About to sleep for 4 seconds before starting... Time:{0}", 
+                DateTime.Now.ToString()));
+
+            Thread.Sleep(4000);
+
+            PNUnitServices.Get().EnterBarrier(START_BARRIER);
+            PNUnitServices.Get().WriteLine(string.Format(
+                "ParallelTestWithBarriersB: Sync start performed!... Time:{0}", DateTime.Now.ToString()));
+
+            PNUnitServices.Get().WriteLine(
+                string.Format("Sleeping  ParallelTestWithBarriersB for 1 second, Time: {0}", 
+                DateTime.Now.ToString()));
+
+            Thread.Sleep(1000);
+
+            PNUnitServices.Get().WriteLine(
+                string.Format(
+                "ParallelTestWithBarriersB: Waiting for peer synchronization after sleeping... Time:{0}", 
+                DateTime.Now.ToString()));
+
+            PNUnitServices.Get().EnterBarrier(WAIT_BARRIER);
+            PNUnitServices.Get().WriteLine(string.Format("ParallelTestWithBarriersB: Sync end!. Time:{0}", DateTime.Now.ToString()));
+        }
+    }
+}
diff --git a/src/PNUnit/tests/Testing.cs b/src/PNUnit/tests/Testing.cs
index d0c61cd..3483971 100644
--- a/src/PNUnit/tests/Testing.cs
+++ b/src/PNUnit/tests/Testing.cs
@@ -18,10 +18,10 @@ namespace TestLibraries
 		}
 
 
-		[Test]
+		[Test, Explicit("PNUnit Test")]
 		public void Server()
 		{
-			PNUnitServices.Get().InitBarrier("BARRIER");
+			PNUnitServices.Get().InitBarrier("BARRIER", 1);
 			PNUnitServices.Get().WriteLine("Server started");
 
 			Thread.Sleep(10000);
@@ -30,11 +30,11 @@ namespace TestLibraries
 			Assert.IsTrue(false, "The test failed");        
 		}
 
-		[Test]
+		[Test, Explicit("PNUnit Test")]
 		public void Client()
 		{   
 			PNUnitServices.Get().WriteLine("The client should wait until the server starts");
-			PNUnitServices.Get().InitBarrier("BARRIER");                
+			PNUnitServices.Get().InitBarrier("BARRIER", 1);                
 			
 			PNUnitServices.Get().EnterBarrier("BARRIER");
 
diff --git a/src/PNUnit/agent.conf b/src/PNUnit/tests/agent.conf
similarity index 100%
rename from src/PNUnit/agent.conf
rename to src/PNUnit/tests/agent.conf
diff --git a/src/PNUnit/tests/agent.log.conf b/src/PNUnit/tests/agent.log.conf
new file mode 100644
index 0000000..6a9ced8
--- /dev/null
+++ b/src/PNUnit/tests/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="Info" />
+		<appender-ref ref="A1" />
+	</root>
+
+</log4net>
diff --git a/src/PNUnit/tests/launcher.log.conf b/src/PNUnit/tests/launcher.log.conf
new file mode 100644
index 0000000..6a9ced8
--- /dev/null
+++ b/src/PNUnit/tests/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="Info" />
+		<appender-ref ref="A1" />
+	</root>
+
+</log4net>
diff --git a/src/PNUnit/tests/pnunit.tests.build b/src/PNUnit/tests/pnunit.tests.build
index ab2bbc4..8db1fb0 100644
--- a/src/PNUnit/tests/pnunit.tests.build
+++ b/src/PNUnit/tests/pnunit.tests.build
@@ -5,6 +5,7 @@
         <include name="AssemblyInfo.cs"/>
         <include name="Cmp.cs"/>
         <include name="Testing.cs"/>
+    <include name="ParallelExamples.cs"/>
   </patternset>
 
   <target name="build">
@@ -20,6 +21,13 @@
         <include name="${current.framework.dir}/pnunit.framework.dll"/>
       </references>
     </csc>
+
+    <copy todir="${current.build.dir}">
+      <fileset>
+        <include name="*.conf"/>
+        <include name="runpnunit.bat"/>
+      </fileset>
+    </copy>
   </target>
 
   <target name="package">
@@ -28,6 +36,8 @@
         <patternset refid="source-files"/>
         <include name="pnunit.tests.csproj"/>
         <include name="pnunit.tests.build"/>
+        <include name="*.conf"/>
+        <include name="runpnunit.bat"/>
       </fileset>
     </copy>
   </target>
diff --git a/src/PNUnit/tests/pnunit.tests.csproj b/src/PNUnit/tests/pnunit.tests.csproj
index c632c84..6abbd7c 100644
--- a/src/PNUnit/tests/pnunit.tests.csproj
+++ b/src/PNUnit/tests/pnunit.tests.csproj
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -78,16 +78,34 @@
     </ProjectReference>
     <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
       <Name>pnunit.framework</Name>
-      <Project>{1AE4D3A7-DA37-45C0-B300-AB7B84DFF216}</Project>
+      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AssemblyInfo.cs" />
     <Compile Include="Cmp.cs" />
+    <Compile Include="ParallelExamples.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Testing.cs" />
   </ItemGroup>
   <ItemGroup>
+    <None Include="agent.conf">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="agent.log.conf">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="launcher.log.conf">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="pnunit.tests.build" />
+    <None Include="runpnunit.bat">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="test.conf">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
diff --git a/src/PNUnit/tests/runpnunit.bat b/src/PNUnit/tests/runpnunit.bat
new file mode 100644
index 0000000..f41cb5a
--- /dev/null
+++ b/src/PNUnit/tests/runpnunit.bat
@@ -0,0 +1,3 @@
+start pnunit-agent 8080 .
+start pnunit-agent 8081 .
+pnunit-launcher test.conf
diff --git a/src/PNUnit/tests/test.conf b/src/PNUnit/tests/test.conf
new file mode 100644
index 0000000..63cc7bd
--- /dev/null
+++ b/src/PNUnit/tests/test.conf
@@ -0,0 +1,82 @@
+<TestGroup>
+
+  <Variables>
+    <Variable name="$agent_host" value="localhost" />
+  </Variables>
+
+  <ParallelTests>
+    
+      <!-- This is really just one test -->
+      <ParallelTest>
+        <Name>Testing</Name>
+        <Tests>
+          <TestConf>
+            <Name>Testing</Name>
+            <Assembly>pnunit.tests.dll</Assembly>
+            <TestToRun>TestLibraries.Testing.EqualTo19</TestToRun>
+            <Machine>$agent_host:8080</Machine>
+          </TestConf>
+        </Tests>
+      </ParallelTest>
+
+      <!-- Parallel Test on a single agent - no barriers -->
+      <ParallelTest>
+        <Name>Parallel_Tests</Name>
+        <Tests>
+          <TestConf>
+            <Name>ParallelTest_A_Test</Name>
+            <Assembly>pnunit.tests.dll</Assembly>
+            <TestToRun>TestLibraries.ParallelExample.ParallelTest_A</TestToRun>
+            <Machine>$agent_host:8080</Machine>
+            <TestParams>
+              <!-- sleep time in seconds -->
+              <string>2</string>
+            </TestParams>
+          </TestConf>
+          <TestConf>
+            <Name>ParallelTest_B_Test</Name>
+            <Assembly>pnunit.tests.dll</Assembly>
+            <TestToRun>TestLibraries.ParallelExample.ParallelTest_B</TestToRun>
+            <Machine>$agent_host:8080</Machine>
+            <TestParams>
+              <string>1</string>
+              <!-- sleep time in seconds -->
+            </TestParams>
+          </TestConf>
+        </Tests>
+      </ParallelTest>
+
+      <!-- Parallel Test using two agents - with wait barriers -->
+      <ParallelTest>
+        <Name>Parallel_Barriers</Name>
+        <Tests>
+          <TestConf>
+            <Name>Parallel_Barriers_TestA</Name>
+            <Assembly>pnunit.tests.dll</Assembly>
+            <TestToRun>TestLibraries.ParallelExampleWithBarriers.ParallelTestWithBarriersA</TestToRun>
+            <Machine>$agent_host:8080</Machine>
+            <TestParams>
+            </TestParams>
+            <WaitBarriers>
+              <string>START_BARRIER</string>
+              <string>WAIT_BARRIER</string>
+            </WaitBarriers>
+          </TestConf>
+          <TestConf>
+            <Name>Parallel_Barriers_TestB</Name>
+            <Assembly>pnunit.tests.dll</Assembly>
+            <TestToRun>TestLibraries.ParallelExampleWithBarriers.ParallelTestWithBarriersB</TestToRun>
+            <Machine>$agent_host:8081</Machine>
+            <TestParams>
+            </TestParams>
+            <WaitBarriers>
+              <string>START_BARRIER</string>
+              <string>WAIT_BARRIER</string>
+            </WaitBarriers>
+          </TestConf>
+        </Tests>
+      </ParallelTest>
+    
+    </ParallelTests>
+  
+</TestGroup>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/AboutBox.Designer.cs b/src/ProjectEditor/editor/AboutBox.Designer.cs
new file mode 100644
index 0000000..ed51007
--- /dev/null
+++ b/src/ProjectEditor/editor/AboutBox.Designer.cs
@@ -0,0 +1,190 @@
+namespace NUnit.ProjectEditor
+{
+    partial class AboutBox
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        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()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox));
+            this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+            this.logoPictureBox = new System.Windows.Forms.PictureBox();
+            this.labelProductName = new System.Windows.Forms.Label();
+            this.labelVersion = new System.Windows.Forms.Label();
+            this.labelCopyright = new System.Windows.Forms.Label();
+            this.labelCompanyName = new System.Windows.Forms.Label();
+            this.textBoxDescription = new System.Windows.Forms.TextBox();
+            this.okButton = new System.Windows.Forms.Button();
+            this.tableLayoutPanel.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // tableLayoutPanel
+            // 
+            this.tableLayoutPanel.ColumnCount = 2;
+            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
+            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
+            this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
+            this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
+            this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
+            this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
+            this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
+            this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
+            this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
+            this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tableLayoutPanel.Location = new System.Drawing.Point(12, 11);
+            this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4);
+            this.tableLayoutPanel.Name = "tableLayoutPanel";
+            this.tableLayoutPanel.RowCount = 6;
+            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+            this.tableLayoutPanel.Size = new System.Drawing.Size(556, 326);
+            this.tableLayoutPanel.TabIndex = 0;
+            // 
+            // logoPictureBox
+            // 
+            this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
+            this.logoPictureBox.Location = new System.Drawing.Point(4, 4);
+            this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4);
+            this.logoPictureBox.Name = "logoPictureBox";
+            this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
+            this.logoPictureBox.Size = new System.Drawing.Size(175, 318);
+            this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+            this.logoPictureBox.TabIndex = 12;
+            this.logoPictureBox.TabStop = false;
+            // 
+            // labelProductName
+            // 
+            this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.labelProductName.Location = new System.Drawing.Point(191, 0);
+            this.labelProductName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+            this.labelProductName.MaximumSize = new System.Drawing.Size(0, 21);
+            this.labelProductName.Name = "labelProductName";
+            this.labelProductName.Size = new System.Drawing.Size(361, 21);
+            this.labelProductName.TabIndex = 19;
+            this.labelProductName.Text = "Product Name";
+            this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // labelVersion
+            // 
+            this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.labelVersion.Location = new System.Drawing.Point(191, 32);
+            this.labelVersion.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+            this.labelVersion.MaximumSize = new System.Drawing.Size(0, 21);
+            this.labelVersion.Name = "labelVersion";
+            this.labelVersion.Size = new System.Drawing.Size(361, 21);
+            this.labelVersion.TabIndex = 0;
+            this.labelVersion.Text = "Version";
+            this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // labelCopyright
+            // 
+            this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.labelCopyright.Location = new System.Drawing.Point(191, 64);
+            this.labelCopyright.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+            this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 21);
+            this.labelCopyright.Name = "labelCopyright";
+            this.labelCopyright.Size = new System.Drawing.Size(361, 21);
+            this.labelCopyright.TabIndex = 21;
+            this.labelCopyright.Text = "Copyright";
+            this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // labelCompanyName
+            // 
+            this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.labelCompanyName.Location = new System.Drawing.Point(191, 96);
+            this.labelCompanyName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+            this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 21);
+            this.labelCompanyName.Name = "labelCompanyName";
+            this.labelCompanyName.Size = new System.Drawing.Size(361, 21);
+            this.labelCompanyName.TabIndex = 22;
+            this.labelCompanyName.Text = "Company Name";
+            this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+            // 
+            // textBoxDescription
+            // 
+            this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.textBoxDescription.Location = new System.Drawing.Point(191, 132);
+            this.textBoxDescription.Margin = new System.Windows.Forms.Padding(8, 4, 4, 4);
+            this.textBoxDescription.Multiline = true;
+            this.textBoxDescription.Name = "textBoxDescription";
+            this.textBoxDescription.ReadOnly = true;
+            this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+            this.textBoxDescription.Size = new System.Drawing.Size(361, 155);
+            this.textBoxDescription.TabIndex = 23;
+            this.textBoxDescription.TabStop = false;
+            this.textBoxDescription.Text = "Description";
+            // 
+            // okButton
+            // 
+            this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.okButton.Location = new System.Drawing.Point(452, 295);
+            this.okButton.Margin = new System.Windows.Forms.Padding(4);
+            this.okButton.Name = "okButton";
+            this.okButton.Size = new System.Drawing.Size(100, 27);
+            this.okButton.TabIndex = 24;
+            this.okButton.Text = "&OK";
+            // 
+            // AboutBox
+            // 
+            this.AcceptButton = this.okButton;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(580, 348);
+            this.Controls.Add(this.tableLayoutPanel);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Margin = new System.Windows.Forms.Padding(4);
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "AboutBox";
+            this.Padding = new System.Windows.Forms.Padding(12, 11, 12, 11);
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "About ProjectEditor";
+            this.tableLayoutPanel.ResumeLayout(false);
+            this.tableLayoutPanel.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+        private System.Windows.Forms.PictureBox logoPictureBox;
+        private System.Windows.Forms.Label labelProductName;
+        private System.Windows.Forms.Label labelVersion;
+        private System.Windows.Forms.Label labelCopyright;
+        private System.Windows.Forms.Label labelCompanyName;
+        private System.Windows.Forms.TextBox textBoxDescription;
+        private System.Windows.Forms.Button okButton;
+    }
+}
diff --git a/src/ProjectEditor/editor/AboutBox.cs b/src/ProjectEditor/editor/AboutBox.cs
new file mode 100644
index 0000000..0ff4317
--- /dev/null
+++ b/src/ProjectEditor/editor/AboutBox.cs
@@ -0,0 +1,109 @@
+// ****************************************************************
+// 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.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Reflection;
+using System.Windows.Forms;
+
+namespace NUnit.ProjectEditor
+{
+    partial class AboutBox : Form
+    {
+        public AboutBox()
+        {
+            InitializeComponent();
+            this.Text = String.Format("About {0} {0}", AssemblyTitle);
+            this.labelProductName.Text = AssemblyProduct;
+            this.labelVersion.Text = String.Format("Version {0} {0}", AssemblyVersion);
+            this.labelCopyright.Text = AssemblyCopyright;
+            this.labelCompanyName.Text = AssemblyCompany;
+            this.textBoxDescription.Text = AssemblyDescription;
+        }
+
+        #region Assembly Attribute Accessors
+
+        public string AssemblyTitle
+        {
+            get
+            {
+                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
+                if (attributes.Length > 0)
+                {
+                    AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
+                    if (titleAttribute.Title != "")
+                    {
+                        return titleAttribute.Title;
+                    }
+                }
+                return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
+            }
+        }
+
+        public string AssemblyVersion
+        {
+            get
+            {
+                return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+            }
+        }
+
+        public string AssemblyDescription
+        {
+            get
+            {
+                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
+                if (attributes.Length == 0)
+                {
+                    return "";
+                }
+                return ((AssemblyDescriptionAttribute)attributes[0]).Description;
+            }
+        }
+
+        public string AssemblyProduct
+        {
+            get
+            {
+                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+                if (attributes.Length == 0)
+                {
+                    return "";
+                }
+                return ((AssemblyProductAttribute)attributes[0]).Product;
+            }
+        }
+
+        public string AssemblyCopyright
+        {
+            get
+            {
+                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+                if (attributes.Length == 0)
+                {
+                    return "";
+                }
+                return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
+            }
+        }
+
+        public string AssemblyCompany
+        {
+            get
+            {
+                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
+                if (attributes.Length == 0)
+                {
+                    return "";
+                }
+                return ((AssemblyCompanyAttribute)attributes[0]).Company;
+            }
+        }
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/AboutBox.resx b/src/ProjectEditor/editor/AboutBox.resx
new file mode 100644
index 0000000..a676f57
--- /dev/null
+++ b/src/ProjectEditor/editor/AboutBox.resx
@@ -0,0 +1,610 @@
+<?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.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAAHgAAAEGCAIAAAAhWcaAAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAScwAA
+        EnMBjCK5BwAAcQNJREFUeF7tfQdclFfa/ez/K/tlExUVmN7ovQ1D74Kg2BWs2CvYEVEEG0VALHTpAip2
+        xd57jzHGmF5MsokxdbPV/XY13//c9xleX2YAMTGJZnfy/PiNiATOnDn3POXe+xtZpew3v/mNCP/9v9/8
+        5j9+g4+i/xDhyf/7z//HnvzXb0T/yf7InuOvfiNij/8TiR6KRN+L/u/h/7EnDwTPv2fP2Sf/T/T9599/
+        //r3D28/nDFsRp8+fezt7f8f98D/zuiBb8l+hl/3A0DLK+WKKoWyWqmsUapqVeqNanW9WrNJo23Sardp
+        tTu1VnusrA9YWx+2tj5qbXPCxuYUFydt8Nz6GPd5/G2ztdUuK6vtVlZbray2WFk1WllttLKqs9LkalSj
+        VXJ3eW5u7htvvPHnP//5r3/96/379//3f//3H//4xz//+c8HDx48fPjwe+7xf7/ehwgoy6sMQKtqVAzo
+        WrWmTqOp12gbtNpGrdVmDrhtVlY7raz3Wlvvs7Y+aG19xJpBzEcL1ta7ra12tMJaW6vV1mjV2WrlcKXM
+        SVZSUvLJJ5/8C8LNgCY6M5RrWlCu02g3alnUa60aOHpusmKIN7UgvodDHEQ+xIGOANZ4AfDJvdZ4SYS8
+        ZlhXa7VVWvVStXKQUmYl27x58x//+Md/KbhFQFlRbQAaXFbXMTo/QrneyooPHnEQHPpAHOcRB8oIQE9Y
+        Q0bwBS0aYsC6Uqut0KrmqxSRiqSkpBMnTvBw//3vf/91i4lIUalQVilV1RydazjR2GgA+hHERnAbIQ5d
+        3sWpSjOHMgVhjb/CmwDvho1WBqwrtNoNWm2JVjVFJfeRr1q16t133xXCDeE20u5fh26LFGUKRQXDmqFc
+        q0Fo67QsNmrbBtqU4CQp4PgOK2i0AXGADugh2bQ8GmFdrtWWaTWZGuUwpcxW1tTU9Ic//AFw/+Uvf/nb
+        3/4Gdv/61kmRYo1CuV6pKlWpylXqSrWmWqOpYVgzzyAMIakfS3BICiEOYeGXR7we9QJel2m1pRy156oU
+        YYrFixffuHEDcP/pT39qz5Y819QWKXIVijyFMk+pWqNSF6o1pRpNuUYLMa1ibgH+rFOIQ0xMFRz2A5IC
+        oKEhvBVpaI11iVZbrNXkaZQjmSdpbGz85ptvvvvuO4JbKNzPuwUUKbIVyhylapVKladSr1YjNGs12vWM
+        a0xMgTgMA2xDbec4bgQ3RAPSAROCANb88lhnxb4t9Bq8xv+oSKsp1KjmqRThiiVLlty+ffvbb7/llcR0
+        kXweqS1SZCqUWUpVjgpYq3PV6jy1Jl+jKeACiBdyb3AB4p3iuBBukm/ATSFIZ1phXajVrNeoc9TKOKXM
+        TrZ79+6vv/66TSV5TqktUq5QqjJVqiwVcgr8nppVGuRyDGsebkK8iGMfONh5gpvCDUYT1rwVEfAapMb/
+        SLNGo0pUyf3lq1ev/uyzz6Ak5EmwSD7X1OaAXqlSZ6pZZKk1ORoWBHceB/fqFoKv0QALI0l5DMGNtJvY
+        TcFjXdOiIRDr9Qas1UvUiliFVCa9dOnSV199ZUrt5y5xFwFlHmhNlsYQ2QK4TQm+joMbBG9R8CeDm/Id
+        0hDe9pFe81hz2oUiicxRtm3bti+++OJ5pzYD+hGdeaDpCcHdHsGhJ8VPoidG7AbKIDVhTbYPLxuwxsII
+        XuPdQ1hDRvzk69evv3fvnpDapl77GV8hRYqpClU6w/oRnY3gxh87hru1fD+e3aicUPEEKFOYYr3uEdbq
+        RWpFFDPab7311pdffskbEr4E+FzIiCggIEBqJ5UHyxXDFKqZqo7gFuqJkXzz7O6MmAipTaVBfDTFGgsj
+        mZ8CDRYP5WClVCk9f/48qA1DAq9ttEI+425E1NDQUFRUlJKSMmLECD8/P7mnXBmrVE1WaZa26LURwTtg
+        N2k30mvAjSUO1tso32kvpQTKFJTO8BoiwNog2fayffv2ff7558+djIi2b9++c+fOXdwD7rWgoGD69OlR
+        UVFyN7myjxKlH82KthA3hbuFfcyZkPXujBEkC0hKgsATI702wnoy6yEggYTzwwpJMkIp+zNeihLt37//
+        wIEDBw8ePHToEJ7gAco0NzeD5jNnzmSIe8lRRFbNMlEVXklMrfcaY9/dKWoT4o/FeiYr+5WVlX366aeQ
+        EXIjqEaZSvYztTyKUBQ+efLkKe6BJ8ePHz927NiRI0cId4AOjk+cOFGmkSlCFaqxJpLSgXCTkoDaXNnk
+        MUk8L9yENZVVSUOQNLaYEIMVmaeSB8rXrFmDZk3Hkv3sYC26zD2uXLmCj8gOLly4cO7cuTNnzgB3vAY8
+        6DCzqEIMGDCAEXyYUr1A4FKMXKAwq/wB1CYxwccOsVYvVOOFz87O/vjjj4WSLUwgn6nlUfTaa6/dunUL
+        H2/evPnqq6++8sor169fv3r1KnAH6FjlATqYDsSPHj0Kmq9bt27s2LEyZ5myvxIVzlYJTnuOW0ht0/qU
+        UQGWqE3BY13Kqk6teL1ao05TKyIUK1as+Oijj+7evQvnxyeQvMt+drAWocHxXsvj7bfffvPNN9GrBvTA
+        HQXil19+GaCD6UD87NmzoDm0BYhXV1djzZTZy5hFmcPBDV53RrV5Q9JBvbs9rJHI8EsungDrdDW6YkuX
+        Lr1z5w6/PPIlVn55fBZa7KLftzygd3gb4if+8MMPgfw777zDgw6mg+bXrl0DzXnEwXGs/rNmzWJw91Oq
+        56kfYd0etcmQtFSmOlohQXOCG0+I1/hX4LUQaxRh8jXqDJbOZGRk4Cen5ZG3IsLs8RfHWgSThDcdbCme
+        4KeE3oEaAJ9A/+CDDwA6Mf3111/nESeOQ1Wg45s2bUKnVeYiUw5Rqhe3lKWMsOZrgbyMtGn+2uzjcNxn
+        yymwLtFqkDTyvOaxjlQsW7YMFMFPzlsRah08I7wWQdeQZcEh4SOewy0BdEDPgw6mQwSJ5oQ4hIUQxxJ6
+        8eJFLJ6QlNra2smTJ8u95aoxnJIIjbZRWYrSSOQ1cCOPlWyCnpvFeYQ1b645oBmvoSERiszMTDBDiDVs
+        3zOCtQgvO/9AUguBMwKdmE40FyIOKccSCh2HpBDBT58+XVxcHB8fj0aJaoaqI6x5N9KmZLfHa+rLcE10
+        VrkmXvNYY20MVeTl5QFr3vaRxX4WsBbRD4EHyup4DtsPhwTo8fPxoEP1UF4gmhPipCpYSIWSAoKTnqxc
+        uZIJ9yAlysqstE0ZjUmBm7VvqNb6WJdNpOZnFvBuQJGPN9c81ilqeYC8sLDw/ffff9awFqH0RQ+MweHR
+        JuhgOtGcEOc5TjoOSUFdDY0+GBXSE/hCpPUzZsxAo4SVTdrHGotbq+Wx49a7EGtKZHixJvOer4HjlOvl
+        VVVVHWBNnu9nzmVEtBzTAz8BHm2CTjQXIg4pB8FhYIng+MWg4KQnPNww3TJrmXKgEhraHq+fAOuWl4Ep
+        O/QdkyG8CWkhNcN6hgqFmq1btxphLVwbf36sRUYvrBB0nulCmgNxXlWweBLB4VVgraDg0BMjuFFFgQVU
+        BHKq3Y6GPDHWEGtK0GH4eBPCY52nUU1UocN7+PBhHmsqifyCWBsDLcTdlOY84pByIcHxa5CCG8FNYgL3
+        jYIJmlKqESqDWJs2JGH7hBa7PQ0Rkpo3fPzC2CIg6Hbi/4X6NXTsGcG6I6B50NtEnBZPnuCk4KQnQrih
+        3fCCyDBRLUHuruijYF6bB1rY/O0M1oIXwDDMBxOCTiMtjAJS43+hHKCcO3culmve8+EnpLyRGup8a+Zn
+        0OtOAW2KOOm4EcHJpeCX4dlN2o2lEskOqihwgampqTAGqiSO2tSmEWLNr41GPkRo+EyxhgnhF0Ye61yN
+        eoVa0UuRlZVlijVfe/rZsH4yoAlxIcF5rwKOkJ4Q3CQm0G5aKskI0jqJ8qbMTaYap2JAt4c19NeoQcNj
+        LVQVEmujhZFePHxnYL1AjeI1TAhebORceKthRaHaE2FNWw5+hgT9hwAtJLjQqJAZ5+GGmABu/GJwJjCC
+        +D2xTkJJkOOgf8bcSJzyEdBCXqMkQv5aOIfWDqlZxkiVED6LEZCabeyYppI5yNDfwP+dak9U54OD4vsy
+        P4MJ+VFAGxGc1xOCm8wJORPKdGBLYLqJ2ugqjB8/HrVWvMENAiKYjTLkMlyObpiyNEoXOyPWHKkZ1lgY
+        pVJoF2GNFx5rCXhAfRkqhvzUWD8FoNuDm18qeeGGkiBhA7VRGgS1kdfMnj1b0VvBEkgjsaYcHeLL1Z4Y
+        1qZ5ecdiTd+QMtJVGizC6enpWCogYni98ZPg5Rcavp9arJ8a0DzcJCb8Ugm4SbhJSYyoDf+HgQ3URtSp
+        Jlij9kSdMH56uAOsTZ01CUgLqfH95b7yyspKvMB4V0HKhEW+n8GEPGWghXCbKgkYBCXB25anNt7LYBm6
+        JIoghSpZ1cZwJbCG/rZH6pYaiKEMwjtrcnutSa2aqsLuApTRkb7y5poMn9HC+FO4vZ8EaKEz4eEmJcES
+        BGqTasMDkCHBb45diMz2zeew5scqARYMHxZGXqz5bkBbJsTgrKnkRGUQntRcvUU5VIk0Fb4e64TQhPwM
+        C+NPBbSRcJOS8Iskr9pkSGiFRPbIilDAGkALRlgNE8PV3DiOsPPSHtbk9ig1JwFpUWr1crUiRAF/idWY
+        NyH8wkiFzJ9IrH9aoNtUEl61hTKC5A1Wl2ENXkNDhKQmseYFRNhRNMVa2B/gBYSUmiM1pibh9jC4gvYF
+        1mSjhZEX66de3vs5gBYqCU9tkhFKbSAjlNeAZfn5+YpgBQYbW/VhKWMkZ82T2khGhGUQ6g/w6aKA1GhH
+        YFwCnWWkTrQwUuXaSKyfutv7mYBuk9qU2pCMIK+B0QbWYBmmNZgPQWWVLzfD7VGXAAICQPnZD+re8u0u
+        ozoqantUb+JXRY7U6mVqrL1r165F6kTZOVaLnzqL+VmBJmrzJW8IolBG8KtSUoPlERMEimgFGybmsebd
+        HjkQfn6sTax5AUG9SbgqUgsih0sXbWQYyIK/FGYx5Kx/CgH5uYFuT0Yoh8S6xC+PycnJKL8JSW0oW1dy
+        qyI/HUljTSa8NjgQvjnAr4oc0ExA+ivnz5+PsiJlMbyzFrq9pyggvwDQRjJCboR3fuSy8WuDa9OmTcOZ
+        CK1I3ZIuGkhNA6hCsTZKFyHrqIEIV8UWUrMUxkteU1OD1JycNdYJKjn9FG7vFwPaSEaEzo9cNrBGqxe1
+        J7RLDFgDL6yKcCC0KgJffti3LawfFazJVpuQGntkRo8ejeYAnDU8D5Wc8Er/FALySwJtKtlUisLvyWMN
+        HyZzl7GpM37rI+3koFWRDrfged2mgMBWC1dFWL0W9cBmdNhq5EoQELi9n1RAfmGgO4M15vzkQXKDCeFJ
+        TbYaukGbM4yw5gWEXxWFuSJ5aih1tobl5RqWl8PtGQkIPxDyVFKYXx5ofnkUJutGvMYIErYdMlIDaH53
+        KU9qfseRcGE0stVYFXmrJyR1tgb2BoUtoYBgQeZre8LmwI+pgTwTQJtaEdg+IdZQT0yJQFJp47Rh9wZP
+        auHurvYcCHUGeKsnJPUsFcZ9MIhi5EAohXlaBetnBeiOsYYPwdAwjj9QzVYxoGlJ5KrVTKlpyyICMtIx
+        qakAQolii3pgUhDTsHPmzMEcIRwI1ZtoVUT9i59QoI7XDyb1MwS0Kdb82kj+ur6+nmXnyGLQL8eSyCfl
+        EGja/Ny+WBvmQIxITZOYWRrMHGO0Hic9YRic6k1UA0F5gGz1j+/CPFtAt4c1mAWswTLMQaPUyYBGRs63
+        BSAXRtueeQERrooogJS3DDeZknqgMjExEU2fjlfFH0zqZw5o07URvEYGgTwCOTrKQMxZJ6kMQHOlaqYe
+        EA06T4s/psIE61akJk8tUA91MiM1Rusx7sPbatNV8Qfnis8i0EZYU95IOToyNwzVwe3h/W7Y+M8viXQq
+        CLCmcxNMV0Wa+gWpTZWa27SKjB+kRpZEqyJf2KNcka9W/zBSP6NAm+aNhDWcAJJGtFlV8SoGdMvOUcOS
+        KDx7RYi10OpRUk6JIu/zOKCZUjvItmzZgkEfKuyZ5oo/uF/+7AItxJrqIVRTxQIFbwBE8GZnQHM7B1iZ
+        CchyJ5UZzl5p04EQqYWeGvaDy1xoexn2PmGKDHsYMF0vzBWFBZAfZj+eaaCNsKaaKrDGwoh0EXuEHm09
+        p9IHAY3zm/jz9tpTaiqfUkeRlJoDGscO4KDJPXv2mFo9vgDyw0j9rAPNY02tGeHCiNoeysqM0ZBpjCSg
+        0AHvwZ12yLDmD8oywtqU1AKggTXG9dLS0mDbyerxBZAfSernAGgjrHmxxqwTmrlgJe2nM3gPOlaSP2yv
+        PaXGP6HqB+/zWtQDWxRwCDP2sMLqGeUvP4bUzwfQhDUVQ3ixRjkC1FMlqOjEISbTSAuhHnR+Jx0iSYej
+        tklqlPRQOTFZEkFqvH5oXT5dUj9PQFMPjBpgqIQgi4HnlXvIkSsaJsdIpun4ZToclU7rbFOpN7ROXlpk
+        min1CNXIkSOfLqmfG6DbE2t0ctGFeQQ0J9OG81GBNU/q1qVqw7Av+TwT9UAPHskLdk4SqU3txw/w1M8T
+        0EKsKYuBaGK9QrFJvVJtmEQgoOmwZQQEpD1SY34MyQtfO229JCr7Mp8HUsN+8J6aTxSF1Y9OlpmeM6B5
+        sRYKCPRUGa80AM3l4uwIWqC8nxOQDkgNcRcuiUL1mMYmfXG8AHlqPlGkpiL1BJ7I5z2XQPPTqnB7SBfx
+        1sY7HV6YOTxKW7Ae0hH5wLo9UpPPw5JIWSIVTlu8B1sSfdlpkth9TYkiNRWNSnqdT16eP6CNBIRSGCg1
+        2gKGdi0BjQOs6ZB23PJApDapfjClxpLIlz5aA40y4bhx49DlouoH6lnUKUdti+rU1HzpZJnpuQTaVEBQ
+        24T90K7lrn4g40FA0y0PROo2fR5at3yWSOl4y6lo2ISLdiI6L9jjDntDozaoU/PzY9R86SSpn2OgeQGh
+        FIZ56ikqQ2GaHB7drgGs93GkxmtgSmosiSh98OohAJpliYHsxAScBQNSU52ab74YJS+PXRKfV6BNSY2T
+        QzCJypZE3koD6KPcHSZ4AlKjfModQSac1aONRoatzlShFsg0aoSjRo3C5BhOEjDNyJ9oSXy+gTZaFXFg
+        iCpFZQz0cY7XUGpUP0yTF1oSeUPd2uSxwqlGhqMBTX2esMvVGfV4joE2XRXR9EOblc5gZ9IBdT7GrkKy
+        BtYHudth2lsSST0oc2mtHkjHoR5YEuHz+CWRpk+fSD2eb6CBNZ+XY2nC749GF7yaodxBQOOqqVM2TEPg
+        qWlJbFM9KHOhqqnglFB4D+ysxv594ZJIE5HoQnS+8/LcA01zwHyxCexD+c1wZwakGUDjWq8z3LVeB7gl
+        0bTLRerBZy5GMj2TZS7YD4olkVq31HkxyhIfqx7PPdDCVRGkBu8wZG69jbt9hwf6HMOaKTWWxDbVA96D
+        Mpc21cNTjoNHkCWi9MFniW0a6g68x68EaCGpUXjD9OIjoE/b2JznAqSGz2tPPZC5UNXURKZxGC6OacXh
+        ipQlokcuNNS8enScufwagDYiNY6vRZGaJd+4MA3ScdrG9ryt/Xl7RupDLephtLMc6lHJHRbZlkzjfIB+
+        /fqhz8Aban6aiUb0qMbUsXqwo34ea7af/S8QKjXe3ShTMOOBVAVAn7GxO2/ndMEJcDNP3Z56GJk8gZvG
+        yLpMy7rjP0Y9fiVAE6mprwh+IcuAS2OifJwBDTq7XnQF1mB3R+rBm7zW6yEVmHJyckg9aMLmSdVDBGV5
+        9gnbmZ+QSE3lU6xd2CdAJtrmnA0g9rjk4X7RnZGa1ENo8gSncrYr0/2U6AWTeph6D34+rwP1YED/OtSD
+        PDX5PJQmMA7JLm6FieaA9rzk6X3Z2/mCs0E92qx7VAlkunXaoprAOrbYfiBUDxTzTDOX9sBk5979aoCm
+        Bi5NJfTt2xclUGgF/AZ0Ayj7XfED3GxJRDrenskT5uKCtEWdopaqpDgWijIXTK2js4MtkZS5UCuAr5q2
+        +f4TUUW1M+/NZ/9rhEsiinlAh1ZCt4tuvld8g64GAWvoNUvHjUwerx5CmW59iwSumcAOaqgHqldQD9NW
+        AFVN21MIUQd/9+wja/oT8qQG+5A9QzeALATa/6p/2MthoddCATrUgw00mcg0OzUIbprSFpP1EIM18+bN
+        w1n81AowrZp2bPIY0L8y9aAlEe9rtAJsDjOB9rrkBTr3ut4r8nokqM28xx5rVp42OaeJuWkUPdpKW1Rx
+        KtygApnmq6ZooWHi1DRFbFOKRU/Uj3kuOM4viUOGDLEtt4VA6y/rweU+1/v0e6UfnjDvgRSxTZmGm6at
+        +ib5IcbPwsLCMJbHmzz0XIxkmu/YmgIleqJ+zHMBNK8emO61WWRDugE6D7gxYMirQ6KvRwN6ZvIg08KG
+        Cy/TtB6ijNfaeOBcRKyHuB6XN3k0MCbs2HYg0+z86I6Xy+cCXOEPyRtqgKIdoYXfgG4AX6A8/LXhg24M
+        gnowmW7PTXewHrqx69F+mEyLOlkTeb7gJvWAMVD5qwAr5KLvK33jbsYl3EoA1vgjZJoNjD12PWxtPODN
+        YWaEMk3zHiTTwj6AqUyL+JoIfrJfmaHGG1kql/ru9o14OQK6MfrW6Em3J417fRzEGp6P9QG4m9CM+wBY
+        D1HGI+PRGmi0b9At27t3Ly/TnXfTIjpn71e2JPIyjeaIvkQPZIfdHDbh9oTENxOnvzl96KtDmclDHwDr
+        ocm5hWgCMONBhWlBaYkNP45WDR48GDeKkZumaTHTokebqYmImoy/viWR1GP58uVeaV6g86hbo6a9OW3+
+        2/MRY18fy2T6cDvrIZoAMB7k8IyAnq4KCQnB7W1ouPBumm+4CJE0TVtEP2zu5tmXbCrm4RBUt3FuoPP4
+        18fPfmv24ncXp72XBlKHvxyOehPri3dgPEwcHu6NcnV13bFjB2Sab9di2AOHBfHnT7SXtoh+2NzNcwE0
+        EjG0rh16O4DOU96YkvJOyor3V2R+kJn8djIMNbJzlh+2CTS1tUwcHho3aP7iLJX20hZ+PTTNAUWoPwmP
+        Aun8MNkzjjWZPBR9tG7acTfHzXxzJric+2FuwZ2CjPcy4ECwHrZtPHA3Bjk8U6BRmHZjt84ZrYfY54Kj
+        xvhBU1rwjJyFqM1hsl9HmYlkGteOJhxPAIvB5fUfrS/9uDT3Tu7E2xNZ2gLjYeTwKG3hKx6tcxbadYGD
+        tbAe4u4CmqqhJgBfxiO7bLoeivjDyH7MTphnk90k04MGDUrYlpD+Xjq4XPn7ytrPaks+Lpn15izk5SwR
+        N3J4BDSGxPjSkpGVjlBgQB3roTA/5Cd66eQJ2g9gRFYR706Ei+avQ0DI5OEswZFlI3M+zCn7pGzT3U3b
+        722v+6wu7d00pC0sEW/T4cFKtwM0WWmMmArzQ+GkB2/hjIGmRZM6BeSpf8AGjWeW0QAa7/S47Lh1H60D
+        vrvu7Trw5YEd93YAdyTlaMG0a6Xby1nilMOHDyfjQd0WzIl1xniI+BP2nu7xFM8I9KBVSUnJwAUDK35f
+        sfXzrYe/Onzym5MHvzxY+FHh4FcHM4eH0lIHOYtJcohBBoweYOyRNx40UkNtLd5WmBafRXREp/DUt18T
+        qQE0Skt9J/et/6x+35f7Tn97+vJ3l/Gx5tMaZOSs4tEm0LXcIG9bWTjmzXr16gWgYTz4tlZnCtPsztmf
+        4niKZ4TRkGnU6SPiIyAXx78+DpQpwO7Jtyej/8JyFpOD1jE0zYZp2gQ6SYUr69G+ERamaSdzxw5PhD7Y
+        T3po0y+LOIBGIzWwTyDk4uIfLvJAg90wHuhysWJpW0CzmUdk4SbSoZ6r9vLywpkhvMOjIbE2G7VCKy1S
+        qdzw+gg3Pf+aVkX8qrAE3kHeJBp8QKlT30nF9AFLDk2vDkDzsD2gF6pdXFwIaGGj9rGlJZGr63SUuPCy
+        GB3aROXTZ62qB+Ae+zBqAiCVcPVyFaKM52D38veXY6SGTae3CTT6LFRXau2jcXWznZ0dgG7TSguHpo1y
+        FlFQUKODQxxuVjI6uPonOgtViALeOlhGMPuDsTZMJuLSWNwWglcdKQYWHH9/f3d3d3t7e41Go1QqZdwD
+        T/BHfBJ/hS+IiIgYOHAg/glO7oeNQ/sDF+Ci3AMrhd8ZKyEe+L/YOdpd+sMlYQBrpOMY82BZeFuXYbDN
+        Fm0BrVmq0Wq1WGDbrOHxzo3vafG/L4De5OdXaGPTCyk87cUVnvr2tI6NxPeBB4IlwvWZOEw4Li4OMLk5
+        OfYODUoYMmD+5HE5C+ZsyFq6rajgaF355R2Ntw/tunP64L3LJ//4yvn7r1/9x5vXH779CgJP8Ed8En+F
+        L7jd3HS5ofxoce62zEUbkqdnTx41L67fmMjg3t4ebnbWSL7xP8LEbY+ePfI25TVcaDjxyYmL31xk8e3F
+        NR+u0V/UM0bzJ4kJdgK0C/QKjUqlAtDt5SxGxdJWQANrnW65Wu2FoiK1DExPvufvlOrk4oZWJN4i4BcO
+        UIPDt7HSRoUETRsVvypl7ua1ueeaagHTP958+ft3bvzYuH3p+1dOPbx08OHpnQ+PbX64v+bhzpKHm1f/
+        vXr5B7mzz6aMbZwwYG6A0/hgt1AXrUohjhgUMW7BuKUblqY0p+hP6bXbufMnEEZXcGHzYZuMztTI5XIA
+        bVosBUFpG0CbySEYvZmLTR4e8xQKWwh8myffd+aEPbyYGJcCZ6dMmWKt1faLjFgwZUJl9vIzm2s/u3Ds
+        xwLawUvy1svf3zz3/bVjD883Pzy+9eHB2oe7GNYPalc+qEh7UJx8d1H8/VXj72eO/nDBgKMTwksG6mcF
+        O0Y4y83Ev+0S2aXnqJ7ShVJVsYqudGYb6Gqt2C5PsneZXAiUGgoGrTNNDoVbEPmqtJDRTUFBWwhuF5fJ
+        uL8K8078NSWPPfkeSxPc4YYNGzBs6exgP3JAP3B2X2Xxh6cO/oTImoL+9vXvb138/vqJhxcPMGofrn+4
+        p/zh1rUP6nMeVC29u2zc/TXTOKxH3V867G9LBv4tNfZP8yOujnOtitXM9RNH2He1sPzvLmFdzMeayzJk
+        OA0LPlqdp1ZnqzUrW7AmxFGS5oCm5JCfeQQ72yz/PwI6OHhrUNAjrB0dR2FFavPke+E1JVgq8f/Azhz8
+        X/tHRiyfk7i3fP1HZw7/rOAawf3mte9fO9+C9Q6GdXPFwx1FDzfl381Nul82//66xPt5k+5nj7m/LP5v
+        6YP/lNL73hzfuzM8705xvTvJ6XK8bWmUYqrOXG/14n+a/Uf3vt3FE8XKJezONBYrWTDQVzLpgCTCE1MW
+        Thtb2gOat9IiAC3Aeou/f5W9/WAc88uffE8rKRVRQXB8d7TcHexsxw0bVLpiybXdm39JcAlrQAw6v3oW
+        KH9/5cjDC/sNen2g9mHzhgfbCz9fl3K/Jv3+hpT7hbPvF0xl1F458i/pA+8lh9yd5XN3Oof1RMdPJjjc
+        Ge/w/lj7plj1Qj/LSNuu3Xv+d7eQbpajLZWLlLgshyG+VI3FEAc+Amg+C8emWqNyh2lDC0BvE2DNqO3n
+        V2JnF4v7q1CUotMMgTXakVjW7Gxtxg8bUpm97PWDux68xZzAT44yFkzG05MGBM/ueXh6x8MTWx8e28Li
+        6KaHRxsfHmlg/EUc2vjwYN1Dhm/Vw70bHu4qfbij+J9Na+6tT7m/cfn9qsX3y5PvF81mMpI74S8rR3yR
+        FnUXWM/2vztDd3eKG3jNsB7n8G6C/dtj7N8cZbc7VrPYTxxl07V79/82CzcTjxfDR8Nf4jharIfIWfi5
+        Ayp3dFBXEqGra4J1k4/PWhubKJzJjj4CblMXi8WDo6NWL06G8frra5f/fht+6+V/tliup4D1q2fZOgbU
+        gE5TwYO6TLaIlSQ/WDvrwerpD3InP8ie8CBz7IOVCQ9WjGaxfBT3ZMyDzIQHWeMe5ExgX5M39UFBIvsn
+        6+c8KJrH/nnpwgfli/5RmnovawqDuHT+/eK59wtn3V834/7qKX/JSfhiWb/PFwPrMIZ1kv7uNI+7k5w/
+        neAIXr+XYP/WKLvbI+1ujbB9dbjt5hjVHG8Lf+1L//nSf1haWq5atQq7dOHwKDmkdI8vd9AhE0YFPFFY
+        2P42sXZzy7K01Fur1bPGjd66Pv/Tc0e/uHzy25fP/OnVC3+7deV/fwTWzIqBdI25D0pTHuROebBsxD8X
+        Dfzn3N7/nBXxv4mhf5ke8sdpwd9MDfpqatC9KUH3JgfenRT42aTATycF/n4iCzzBHxGfTw7E3345Jejr
+        qUF/mBaMf/XXGSF/Twz5Z1LoP2dHsG+4IBbf+f7CQV8kRd5fFnd/xYj7WWPu5yTczxmL+EvWyHvLYj9P
+        i/48NfJucujdOQF3Z/owrKe4fDbR8aOxDh+MMWD92gjbG8NtX463vRZnWxQmG2PT01NhiWIp3uJ8+Z8f
+        8MC7n59LF7ZoRRERxzisdxOvAwO3eHvXubiUuziXujhlaJSBq1PnvXVkN1wEsP7yyqk/XD/755sXeaxJ
+        QDrWEMbW7YWMX1njOEwjAQdwAUbA6+OJAXfGB7w/zv/dsf5vj/V/c6z/Gwn+txP8X0/wuzXG77Uxfjfb
+        Cnwef4uvQeCL8a8Q+OfvjfP/YLz/nQkB+Lb45nglPh/v+0Gc03fT/f6a6P+3pKC/zQn/W3LU3xb2/VNq
+        n88Xht5dEMYYPT/k7twgxmtgzSTb7e4Ep0/GMazfHW1PvAbWAPrKEJsrsbbHBriuDLDpaycLDw9PSUnB
+        ukXlf3J4lLPwDS1aDwH0SQ7rA4GBO3S6OgeHYne3Ch/vmiC/BoTeM8taHZKfMvfto3vunD702XmG9XfX
+        zz0Ga6B/bPODmmUPciYyZGeG/3l6CMEKCIApAQqAhFC+Otrvxwf/qtDLgNfs5nCvKwMc3hzr/e54/QcT
+        9B9P9Lk72ffLKX5fT9PfneIE/jIWQ6MhHRR4znjNsP79WMc7CQ7AGnptwHqozbX+dreGe96M97gR71ka
+        7pDgprKRWi5YsADlaagH5vDoKHWsh8JzlwD06dDQoz4+u11cNuo8N/rp64P9N7VEY7B/o94zx1Ybnj1v
+        5jtH93505tDdC8e+unqasEY2TBpCvH5wZjeT1+wJeM/+IzEUb2e864XI4jfnGfrjMe3kd7gy1P1Mf/vr
+        o7wQN0brbo7RvZ6ge2Os9xtjPV4ZY3trjN2bY+zfG2sPXYZiYD28O9mFoTzZ7e5El7vjnT4bx7B+fzST
+        kddH2r06zPbVQQ5vDPd8nWHt+epwr1fiPRuinWforD3UMpSM0BpHmQX5Id2aw9/FIPLzO+TpsdNXvyck
+        cH9Y0N7QwB3B/puNsPbV5dtZRWckTXn3WDOw/vzicSHWf99T8fd1s/938eB/zAwDuJBOgIu38FucCPDg
+        dhKXp/5lFwe5nhngeG2kF8XLo1gA9CujXE8Ptz4XZ30x3ubKcJvrI21vjrJ7A1qRYP/hOAfoxqfjHIEy
+        gnj9wWj7tyEjcXa3Bzu9M9LrzRFer4/wwtvlRjyw9ro+XLc91m2ur63eSgHtxvLIV+Xo5i2Rn8+BsOBj
+        vcKOR4QeDQ85FB7cHBq4MyRgS2u4N/npC+1tBiRPTHi1eSth/WVjwbdZk7+b1+eP04IYuOMBrh8Dd+wv
+        D67w1To/wPncIGceaP7JhREux+Otjg21OjHU6uRQqzPDrM9zoF8bYXt9hO2tkbZvjLKDaABfoIz4cAzD
+        +p14+3fjXO6M9npvlO7tUbrbI3S3Rni9Olz3ynDdy8O9rw333tnfY66fvY+1EudpwfNBrOFAQG1Rr7BT
+        XJzsFXYiIvRYeMjh8OB9YUG7QwKajLAO8K10shs+pW/EmdlxH86I+ni8/7vjfN9I8Hl9tM/N0b43mcL6
+        3mDhh3jqxPzB3/BsP8cLQ1xMgT433PnYMKtjQ1piqNVxDvHTQ63PDrO+MNTmSpwNnAa8HRQDugHQWcTZ
+        3xnu+kmC7s4Y3fujvYH1W6N0r4/U3RzhfWOEN8N6hP7KCP22fh4zfe3ctYri4mIkIpARHmjC+iSwjgg9
+        Eh4MGQHW2zisOSXxawjWVQd7bHBRDZN16VnTy/F8nO5CnPfFeO9Lw70vj9BfG+lzbaTv9VG+r7B4hrA+
+        1df+4jA3U6DPDndqBTSP+BCr40OsTg62OjXY+uxg6wuwGcNs4DeAONbD20Ps7gx3+zRB9/sE748T9B+O
+        8X5vjPfbo73fGKW/NUp/Y6T+5RH6qyP0l4frL43Qb+zjPlFnZ6uSw3QLgeapDRk5Eh5ykJPsnSG+DcFe
+        VcHuZUFupYFupQGupS6aCXIzzQp/qyODvU4O052J051ncON/AKx9TLEmjvPBvRIs8JUvj2RxdaTvlRE+
+        l0f4XBzO4jwiXo84F68/G6c/Iwj8EYHP0xfgK/H1l7h/i++AVxrfDd+25Wdgb6/j0TaX4z2ujvRCCOE+
+        M9yhbaAHWx0dxOLYIKvjgxjip4WID7B5O97tzmjdR2O8P0nQf5zgfSdB/0GC/t0xPm+N5t7co3yuj9Rf
+        Yz+Snn6XwkjXoW7WAPo0Jx30USgjR8P994Z5bwn13BjkXhXgVh7gWubvWkrhbjNXbe6Z5K48MNDz+BDd
+        6WG6c/Fgt/7KcIY1Ufv6KL9XRvsJMcXnAQf97wHW6Tj9iTjvY8O8Dw/VHRis28/FvsFewmge5GUURl9A
+        /wr//NAQ3dGh7LudjPPGa4OXgb1s8boDUVYXh3teGuF5eYTnFS4I9JPx9keHCqSjhdFHCeiBhgDcPOJn
+        Bluf62uFMXashO+M8oJ03Bnj/VGC/qOxPh+O9Xl/rO/bCb63x/i+NtoHvzVwwMt/gSMNfk0CunWEnuoV
+        cKiXT3OE984w3fYQz81BHhsD3asD3Db4uZb7uZZxUertsMJG0iveTlId6XR0iO4UqB3vfSFefwlwM51i
+        FLs8whd0I1hPxemFmAIvQnBvS+wZ6LWbi12dCPpK/BME/x3oG9IrQejv7efWFGF1ZKj7sWHuJ+Pcz8R7
+        nBvucXEEw/14nM2RIdojg7VHh1hRkF4bAS1EHAQ/Ea29OsTtRpzHa/Geb4wE3N7vj/H+MMHnzljfO+N8
+        Pxjn926C31sJvrfG+N5gWPsS1vj1WwMNiP0P9/LZF6FvDvcGnfeEee8K0e0I9moK8mwI9Kjzd6v0bw23
+        o2qErKt8hb81ZOTEUC/AfWoowhsfjw9lVD04xGvfIF0z98sTrAQooblzgOeOAZ7bBbGtvyfFVpPg/wpP
+        hP8E3wGBb0Xfk14AQn9rtFNDhNWuga6IPQPdmge7HRzifnSo+4k49+YhVvsGaQ4M0h4arD08WID4YKsj
+        AkbzQLMn/a2OR1tfHup+daj7y3EsYXlthNcbI73fGe39XoLPh+N8Pxzn9+E4ZKdwX36vj2HuAFIGrEG1
+        Fo02hhgoI5pDdXtDdbtDvHaEeG0P8twU6FEf4F4jgJsR3M16jtpcN9FZ3hDjuneAx66BHrA47NfGc/bL
+        4wnCaycHKwFkwLGf59anGNzLw78ABH19L7uNkbbbBrhuH8hiB4c4YsdA54b+qi2xqu391Lv6q5sHavYN
+        1BwcxCE+SHtkIMKKohXQ/axOxNheGuIOrK8M87g2zON6vOdNOLyR3m+O0r+bAPVgQH843h/Z7zssjWD1
+        A6gosOaAJqHQ7+VYzCIUoWNAU/Bwc9RuBLUfwe0GrMu9nXJtZP0tXuqxUK9t6OPaGOu2ua/75lj3LbHu
+        m/t5NPXzYB9jPZv6sXia4Hbw3bg3RGWIVV1v+839XZoQA1wRWznQN/W3r+6rrIlR1sYo6/ooN/VVbY1l
+        iO8doNk3QHNwgPbQAO0RCiHisVan+tgxoBnWHleGelyN83w53uvGCN1rI/W3R+nfGuP77li/98f5od7y
+        PuwvV2lAMgysRb18m3sxiKESLAhiPhjKLRGi2xOi2xXMqN0U6NEQ4F7n51bj51bl61rp41qBcNYmKXp6
+        xNlJ80MdqqJda2LcNsa4NfRxb+zrvqmvx+ZYjy2xBrh/Hqzxohb6yOtiHBtiXRr7uWzq5wLEt3Cg18Xa
+        bIhRVvRWVkYrq6JbI95XvStWvaefZl8/zcH+2sNCuPtYnY51aAX0MM+rcV4vI2EZ4X2TOTyfN8ZgSfR7
+        lwmIgdfAGoUXUbj3rjDv3YhQoKyjaIV1C9D7Qr0RzYA7WLczyGtbgOcWf48GP8DtXuvrVu0LxN2qdE4F
+        1rLBFi9JprmpKnu7Vke71sW41ce4NzK4GdaIn43ajTGuJQEqoCwMQryyr7Y0WlEWpSjvrdzQ24B4NRCP
+        VtT0Vm6MVqIAvb2PGoX/5n6aA/0NBD8crT3T3+niEHdOPTygHleHeV6L87oWz9LCV0bqXx2ph+WA8Xgz
+        we/tsX5gNOCGhgBrUahue6j3TggxF62wDtHtRTxiNFD23hesQ+wN8tod6Lkj0HObv8dmP/dGX7eNvm6A
+        2xCuNgvVlkGRavNUH2tQuzYa1HZvk9o/qZLURTqWh2iNgKY/lkari3srSiIV6BMieMQreyuqohTVXNRG
+        KRujVU0xql191XtiGcEPRGnODnC+MNgNQF8a6nF5mOcVDuiX43XXh3tfH6G/Mcrn1VEsT4bruD3Gj4Ob
+        lSoRomCvLSHwcLodobpdPNacSjCUDeHdDHCDdfgIlPcHGaI50Gt3gOeOAAb3Fj/3TX7uDb5u9RzoG31c
+        axzUU2TdXQbbSDID7Wqi3UypDSXZHOtZHOWWFeacEuAwTW8/ysNmgItVLweNv63K00rlpFbYKOVquUyB
+        HrBUisAT/BGfxF/hC/Bl+GL8E/xD/HN8E3yrkii3LZx2V4XZVobbmAJdH+tcHK0silQU9WJRHPkI8XJw
+        PFJREamojFRUI6IUNVHK+mjllhjVjhj1nnD1qQEu5wa5XRhiwPpKHJMOMJqAfmWkz42RPjAbwPq10b5U
+        pwWdUQISYWWDnQj22gZrAaxD4DEYyoZg5NXtCfJiwT1vDtLtA9DB3gcQHOIM7kCvnRzcTRzBgXgjhbdz
+        ka1ipKSbdoSDLC/EAdReHea80N9hks5ugIs20FbloFI4OztjaikmJgZTRRMnTsRw16JFi9A/w7HvGBHB
+        IANua6qrq8NwDx5o1uEyicrKSoyXYw42KysLnWJsKsEkCcZ0cLxPYGAghhAdVYogO3WoovsYN+XCQNuC
+        Xg5CuGv62hf1VvBAE9wIEJxFL3lZL3l5L8WGXgzuqha463opt4ZrD/dzOTHA9cwgt/OD3S8SqQE0V1Hi
+        gYaDfnUUwxqWgy+Li+CLA9xr4SWCPbdioQvR7eSw3h1swHc3oRzIRRDDGsFjfTDYG0GI7w302tVCcCAO
+        Bd/McPfY4uaQp5IO6fI7qaKnmaWFOTaf4iSNqVOnoteOOTRs2wN2GzduBIiAEp18PFAcwAPjE+iB0gNz
+        haYPtKLxMP18eXl5cnKyhcQCc0k+4T4WEnN3rSTGSTlRp80ItlsfZdUm0AzuCEVxhBxYl0TIyyJawx2m
+        aAiz2tnHaV+s85H+ricHuZ1lWHtejvO6Gq8D1gD6+kgfRmoOaPAahTBgTc0gEXI8+LMA92p45CDPLaB2
+        kNeOIK9dUGEKjrAGoNvB+lCwN4IQJ4Lv8vXY7u2+1dOtyc21yd19u5fXThcXbAsZZWFhN3ToUOwcrqio
+        qKqqAsRgKyBGA59HFsABPkyoYBoID/RAMVGIB7rO9MAQeJsP/gvwxajB+/fyz67PRmTVZc3JmTN69uje
+        cb09AjwU8hf1Ni8Nde0+39eysIXOBl5HKIrC5YhiLgB3aQvcFSGKhnCbbTGOO2Kcd/d1PtDP9dhAt9OD
+        Pc4zrHVXh7PSHQN6FAOaYc0BTVgjCGgEsupKf/daf49NAZ5bsdAFee0EXlwQ1o/gbuE1ZIQ05FCI/jAi
+        2Puwv+6Q3nO/p3uzp2ezTrdfrz/g53cwIOCQvz+LgIDDXl4bbG0nisUumALFwSUgMlhM/AW+ABewEpSY
+        mkAvDt1PPDDsgH4zHujK0wN9fqMH/1f0lTihNG5q3Oqtq1c3rc7fkp+3OQ9zjrmNuasaVmlSNWZDzV4M
+        ePF/bP7HRvFCpH3Xad7m+WEyjtEMZRZhLAhrA7sDFQ297JqiHZFtbu/jtLOvy95+LocHup0c7HF2qNel
+        eO8rwJqRGksiAxoVY2FpV+TrUuzrWuLrUuqDcC33davxd28M8NgCzYUOtId1C7UZ1kHeB/y8Dvh4HfLy
+        PKzTnfD1PR0QcCY4+GxQ0GlEYODJwMDjiIAA9hERFHTCx2eTg8MchSIgMjISJ0JBPQAxcRb4EqxowWEO
+        CPNQeGASF9O9aOzjgV4RHjhR0ehBn6evwRf7+vqmrEkp3FO4fvf6dbvWrdu5bu2OtQXbC+bWz5XlysSp
+        YvFcsXi2uOeInl0jur7g/IJK9j8Rdl2neZkXhD4C+hHcQNxP3hDpsKm34+Zop60xwNoZWO+OdT0wwP3Y
+        YM8zQ71QMb4ynJWLoR6M11xpHs9hBFETF/m4FOudi31cSvSGKOMc8UbIaztYP6K2v9devcceT/e9XgDa
+        5yiH74Xg4EshIZe5uBQcfDE4+Hxw8LngYPwVC0IfT0JCzgQGHnZ3z7KyGmxhocJFHHTYGXgKZAlWQInD
+        9TFzhS3dOJgLQ4HYqYouET2w+4Z/8J/EF+DLsH56+XuVHypHlB0sKz1QiijZX1LcXDy0dqg0VypNk0oW
+        SCTzuZgrYYiP6tk1tOsLdi/YSl/oZ2+W7GNJKBsiRF4eqK6PcmiIIqydt8Y4b+vrsjPWdXc/t+b+HkcG
+        e6K8g3IxKtGokV4f5QNDcn6gy9He1qdiHS8MchfpnYsQ3s7FCD1AZ3CX6l0qYIrhH2AkADdMhZDaAV67
+        fTx2e7nvdnPdBX3w8zsSGHgiMPAUByLQPA+IQ0KuhGLLJIurXDDcEaGhF1riYmgo4lJY2BVf33onp3kq
+        VQgRnC6pAl6EJgau0MzHEDAeGJ/AhhGMBmJgxeiBT+KBv8XXwLcMmzSs7kxd3em62lO1NSdrqk9WV5+o
+        rjxWGVATIM+XY5JRtlgmXSSVpkqlKVJJMgf3DLHlRMsesT1e0r3Upft/+ahfGufWIz9EBqwLA+Ubgq3q
+        Ih02Rjo29HZsjHbaEuO8tY/L9ljXnf3c9vR3R5Hn4GDPE0N1UJITA5yP9rE/GmN7pr/zxSEwf74IAF3o
+        zQJYs2jBGnCX+bgi36sXUtvfc5e3xy4Pt12QYOivvz9YfAxBmsCpBOAGWxnWwDcMZ82FvRIefoP7iLiO
+        wCfDcYyDICIiXunV60Z4+BW9foOj4wyl0h9GDasZ5BuoAT403zDchsEJjLliPzAeGOLGA+19/kGfwV4S
+        PLBnIL04velq05YrW7Zc3rL58ubGi40YRK86W2VfZ69Yo5CvlMuXyuUZclk6Q1y2SCZNlkoSJeLJYsx9
+        iceKLUZYmIWaveDwgq3shcGO3dO9xJWhNrW9HDZGOdZHMaAbo50Z1n1dd8S67ezvDiVpirLfFG7dFKZt
+        jnY41t/9/FDvS3E+V+J9rsb7MKBtFcO8nddzYQr3I2r7uDfp3La6uW7T6Zp9fbG+AWIKBjRhDfHlgikD
+        5AJYh4VdBbIREa9GRLwWEXGrVy8+XouMvBkZiY+PIirqVlTU6717v9mr13U/v1onp8kaTTBOQEtKSoJr
+        xuQ1htswGosH5lRwNhceGJjHFhWjBwRdF6ADvrtf273r5q6dN3fufHXnjhs7tl3ftvDkQnWDWrlWqVil
+        UGQpFJkKxQqFfDlH8FSZdKZUmiiVTJZIJkrEEwyI9+jb4yWXl2Qv/vcwB1mmvw2yTWDd0JsBDWpv7GVX
+        G25TFaypCdY0hNtu7e20K9Zz3wCvo4N0p4Z4nxumvxjnc5nDWtT9f16wksZ4OqxqC24m3F7OZe7Olc5O
+        tZ6e23x9m/39mYsICDjCBQM6MJBnNEh9Ijj4ZHDwKU6Fz0EcoAyEda9er0dGvhEV9VZU1NsUvXtTvMUF
+        nrwTHf1uTAzivZiYDyIjryECAzd5ei61sxuhVHrGxsZCWOALId/oeGKiEGNBeGDOHoNY9BEP3FGWMCvh
+        wDsH9r+zf9/b+1i8tW/vG3v33t476OggVb1KWaRUrlYq85XKPKVylVKZo1SsVMjT5LJ5MtlMmXS6VDpV
+        Kp3CIT5JIpkgsYyyRFaFoSRrcc9BttIMb9WGYG1ZgKrET7khSFMTZtsQ6dTUx2NbH4/tsZ47Yz139/Pc
+        28/r0EDvE4O9zw7VX4jzAbVFWUF2fa0sVRYBrjapLVgb2O3pVOTqWORgX+TqWqnT1ev1W319d/r5AWuI
+        BsM6MPAohzLRmWf0yZCQU1ycDgk5GxZ2Pjz8UkTENYgD+AvCEqDR0e8DTUSfPh9ycYeLj7j4uE+fT3r3
+        vt279xsxMW/FxLzTp8970dE3Q0K2+/hku7pOsLYOlkhkMHDQYqSOWD8hLJgPwgOTK0gR8xrzjn549Oid
+        o/h45IMjiEPvHTr47kHvQ97qjWpVqUpVqFKtU6nWqhjiq5WKHIV8iVy+QC6fK5fPkgNuWaJMNl0mmSKx
+        mGDRzbMbdmIh4XzxxRe7d+8p7fJifyvLlb5Wdb2c6qNcGqNdG6PdtsS4M6z7eu4wYO21p7/uwADv44O9
+        zwDrYXpRYbjzmjDH4fYyqZmjo2YqYe3ltN7VYZ2D/ToXlzJPzypM43GxUa/f7Ou7zc9vj7///oCAg4GB
+        wPpYUBCCoRwcTHQ2AB0aihmo02FhhPXFiIgr0ISoqFeBYHT02zEx73PIftK37+/79v20b9+7sbF3+/VD
+        fN6v3z0Eod+378f9+n3cv//HAwf+fvDg38fFfTpixKejRn02dOjF2NimiIhVfn7T3dxira3d9Xo9Bg8H
+        DBjghSzr9u6D7x089MGhIx8eYXAjPjqadytPc1ADoNXlanWJWlWkUhYqFesUstUyaZbUcpGlxTyLnjN7
+        dp/Wvdvkbi+Nf+nFhBd/N/p3L45+6X/kv/Pw8O/TZ/jIkYnTp6ePHTs3LKyfg1Q8xkVTGAoNcd0U47Yp
+        xn1LH/etfT2B9XbA3c9rd3+G9b4BuqODvCEjotJeLoURDOupbirLLlIb+TBXh7WO9mtdXIo9PDbodOBy
+        lU5Xg2iBu8HHZ6uf305//2YO68NBQUeDg49zAYgpThHKBHR4OOJcePiFiIhLkZFXo6Je6d37tejoNyER
+        QLNv3084iO/17/9l//5fDxjw9cCBXw8ahI+fDRp0d8iQz4cO/Twu7t7w4fdGjvxizJgvxo37YsKELyZP
+        /nLGjC9nzfpq/vyvUlO/Sku7t2DBzVmzjvj4jBiXPHnfOweb3zmw9619e95s3nV7987Xd+64tSPqYNRL
+        1S+9uPrFF3NefDGTxUsrX+qyskuXZV26LurWdW7XrrPMzBJ7dE/s2WOmhXmSpUWSRDxTZjFc2r27eVJS
+        RmLisqSk5bNmZc6dmz1/fu7kyQsjIvrr1fIkL9v6aAb05j7A2gNYb4313B7rBax3cXA399cdHugtquzt
+        UhbJsF4b5jTaRfXb//xPS8tejo4rvbwqEC1AM6y9vWv1+jq9Hryu9/Fp9PPb5u+/OzBwf1DQ4eDgoyEh
+        x0NCToSGngwNBcqnwsIA8RkKDuizERHnIiLOR0Rc7NXrclTUNcAdHf1aTMybkIXY2DuxsZ9yWDOIhwz5
+        Ji7um/j4L4YP/2LUKID7ZULCl+PHfzVp0tdTpnw9Y8bXSUlfz579TXLyN4sWfZOR8c2KFd+uWvWHgoI/
+        5Od/IldZlx2qOfHp+RO/P3fi03MnPzt38u65U1x4ndartmmV1VplhVZZzkJRqlGUaOTr1PJstWypSpam
+        lC1USlOU0gVK6XwFQjJPYREpCQqKAbhz5uTMm5ezYMHqhQsLFi1au2RJ8bJlZSjYhIT0jbZTLwtw3NzH
+        A8GwjvVC8Fhvi/Fs6uUlQm0eWOeGOg1z1drIxBC4/v37S6V6e/s5Xl6VFCC1tzfCgLWPz0Yfn3pfX2C9
+        JSBgZ2Bgc3DwwZCQI8AaQIeFEcqnw8MBsRBlAH2uV6/zXFyMjLzcwu6bMTFv9Onzbt++d/r1+7R//y8G
+        DvwGWMfHfzV69FcJCd9MmPDN5MnfTp36bVLSt3Pnfpec/F1q6ndpad8tW/bHrKw/5uX9ae3aP5WU/Lmy
+        8i9z5mwZMCbu1N0Lpz6/cPrehTP3Lp794uJZfLx3ceVbOepjVqrNLUAD6w0c1iUaxTqNPEstX66Spatk
+        i1WyRSpZqopHvKeHOC5u6oIFeSkpq1NT1y5eXJieXrJsWXlmZlVOzsa8vMaCgi0TJiTbymQJ7jblka5b
+        +no0QUBivTZFe9ZHeG4M86wL9agPdRehTDzfzz7YRgnviZIjrgzAFiDszerZU21lNdzDYz1HagPWen2N
+        Xl/r41MHrDmgEZv8/bHdCOPVGLI+HBqKCeAT4eGnwsMZ0BERIDIFQ5kHOjLyAhcM7qioK717v9y7942Y
+        mNf79Hm7b98PYmM/6d//cwjIsGHfjBz57dixf5g8+Q/Tpn03e/Yfk5P/uGjRH9PT/7hixZ9WrfrTmjV/
+        Li7+S0XFX2pr/7ply99iYqZl1uSd/eLS2S8vnfvq8nkuzuH5l5cGXBui3melarRS1Vqpqrio1CIYqdcQ
+        0Gr5kpZIMyAunarsKRODzosWrU9LK8rIAIvLV6yozsmpy8/ftGbN1vXrdxYV7Sktbc7Orhk2bFKItTrZ
+        27E23KM6hEVViHt1sFttCMJVNNrD2kYhw04sXECwdu1aeKO8vDxsHcCCHh0drVCEOjkt9Pau5BhdpddX
+        A2sfn1pf3zqkc35+Df7+AHpzQMAWjFcHB+8NCTkQiimn8OPh4Ri7Ph0RQViDyBRE50fRgji0G4hf7d37
+        enT0q4R4bOwH/fr9HgQfNAjs/jYhgcGdlPTdvHkMa9A5O5sBXVr6l6qqvzY0/DU7+2xgVMSh908wlL80
+        oExY7/v8oPM5d/VOK1U9B3Q1FwxrK2WpVpGvUWSpFSvU8gwu0rngQJcMUISGxi5ZUgQWL11atnx5ZXZ2
+        bW5uQ0FBU2HhzpKSZlieysojWVmHZ8w4MGTIAU/PTPOXJIOstPm+zpVBrlXBhqgB0Dh8GiX20tJSJAXY
+        kI1aOxDHA5UHfH7ChAmWljY2NqO9vAr1egBd5eMDoGt8fWv9/Db6+dX7+zOsOaAR2Gu0IySkOTT0YFjY
+        0fDwExERp3r1OtOr11ku2oUb0LfmOEO8heNvgeP9+oHj9yApcXGM4FOmfDdz5ncLFjBqA+61a/9cVvaX
+        wYPT5+Sknrl36UxrRgPoWbfnqY9Zq5qsVHVWqhouOKyZWBdpFasAtEaxQqNYSvEIcUu9bPToWRyLKzIz
+        QeSN+fmNa9ZsKyjYnZ6+b/r0g3Fxh2NioJmHoZ/+/jvw/gZQKtVwvUQ+39WuMsilKtilMph9FKFbgQey
+        ABhSPFAyx6OMewB9PNDsgGdSqUJdXFJ8fKp9fYEyCz+/OmAdEFAfENAQEACssSUUG0OBNfbTEdwHwsOP
+        cjsKTOE2prYJzaEql6AqLTSHjt8W0Pwe0RygT53KJGXKlFccPfT1F3ee/OzSqbuXTn1+6TSP+JeXAy+F
+        qputVJtMgMaSuE6ryOWAXq5RLBPEUo1shspCLsW6l55ekZxcPWNG7ZgxdYMHN8bEbAsN3QUXEBCwJyAA
+        T2DA4As2A2UoKvemr7C1naXoJh5lqwXKFCIUuvCgNgdq8PQRZWL+I30SO+UlEitb23idLh/5McLfv44L
+        hnVgYENgYGNg4GbwugXrbSEhO0JD92LTRlgYExMO8dMt1O4IaB50Ac0fgd7C9Df79mV2pV+/zyAvrq7Z
+        CfNmHv7o0pGPLh39+NLRTy4d+/2l459eOvHppZVvrJYfsZFuspJWa2WVWlkFCzk+lmtkRRrpKo00SyNd
+        rpFmqCXpLMRL1JZpaovFarMouZ3dwJCQ4oCAUhRhdDoKJqEQT2CKJYpk09/fEPgMFBV/i7e+i8tKqTSm
+        t0qVo3dkQBOg1EZC9Z36RsIGB3ocKBbjgYYIenoqlY+z83Q/vyp//9qAAKDMB4Mbh1JgWzlH7S20fTE4
+        eDt2IoWF7QsPP4zNMq3hbkO1TXW8TdxbNB2r6CuhoYfVNi4lBxoOfnj+4IcXDrG4aIg7F0NPDejRpO1R
+        oelRrOlRqOlRpOlZyKLHGk33HI1ZhtosTW2WojZboO6WrBKE8gVbsZXVNDe3bDe3HC7yPDxWe3mt9/Yu
+        9fau4MQTQAPibQEB2wMCdnAfEU2gtq8vsg2YtA1q9WhvsSzFzU4EiNGjQ3cODQ7qbqCvgdI7dTGo+o6P
+        eOCPqBdjwUQvytq6t4dHakBAHRcbAwOBMgWjNoe1QUla4CaCN4Pg4eFHIiJ+CMHbW0sdHOYPT5x88IOz
+        Bz84Z4gPzx3kovB2rXy/Q/dalVmJymy9ymydymwti25rlN1ylV2XKbqmKbouVHSdTyHn46U46W9/a+7k
+        tMTZOd3FZamr6wp39xwPj3xPz3Xe3uV6faWv70Z//ybgC+kICtoTFLQXXoB7Ar+7HX/FsRtpR5WtbaKV
+        mVjEQ4zuEZpGQBPVL7QqUHHHA0VhVNxRTafSOz6DKhr+Fvtq5XIre/shOt1KgjswEHC3hziEu0mA+C4O
+        8YOcgrMF80klRYg4fk+VtXNhcy0HtHHEnI4z26o026AwK1SYrVeYrVOYrWXRbbW8W5a8a5qsa6qs6wJZ
+        1/nG8TtfsUzW18lpcQvQmW5uqzw9C3S6IkgwpxubAgO3cb52H9IILpM4wHnc/cHBe+DBOGoj26jGO8DR
+        cb4ImkAsBmfR10BTA4Ci3I6N5Ci046wlqrLjI0rD+CPK8KjH4wUA5RcuXKhUOmOfvl6f28JuHnQjgpOe
+        8HBDUsBxJikCxJ9YxIG4nd2cUbOmtolyzVvb1QeczTYqzUo5oFtQNluj6JYr77aMA3phGyh3mSL9rdTc
+        2nqak1Oas3OGi8tyV9csd3fQGbpRBpLC1+KosMBAbDreFxICiJFAHOHiMAc02A1eY7M3pLxcp1vn5ZUn
+        Qo8OgoDuEXgK2gJi4AtYsV0f9XUU0VFZRyEYDzzBZ/B54A7QCXEoODy4SuXu5DRGr88LCIBwUzwR4jsF
+        qsLrOHxh2+6bZzRoZePiWXa4sU2gB59N6L5dZVapMCsyoXO2vOsSjs4pbQD9Ym+JuXmQk9MiSAd0w8Vl
+        BejMCXQhZBdrHdZAQd5wGF4WEHNxICQEAgLVRipX7eeHL4agF+p0a0QgJrQCmgB9QMcIrSBACXxx5CDK
+        6lT2xQP7FPEcJXaU2wlxVCZBcBAf/xCraGJiokrl4eg4xtt7lQDuxyMuVBWsnKGhewQ0N5Jy48XT2nrq
+        pEVz2kR549s7tQddzeqVZmVt0Xl5u3SGjPyPnYVaPapFN5a5upJurNHpijl1RuoAMdwJC0sulsN3D+0+
+        RgGd87vQFphgiAwcC4AuEEEu0KAjIgM7QIwWBiAGuCii49wIqvPSA1sVUWgH4oAbHOfhBrshJpjN4OB2
+        cXCAC1zRGm4DzVtLeXsrJxOW1qBj/RQynaU/eBd7BYfUX9zVLp13tEPnHHnXdFnXRW3T+aXBUjMzL6Kz
+        szPoDN3IdnfP45ZBoMb8BvIGZGdcggaZRgWCFn/QHJ9vxLsZlszPDy9JuY9PCYDW69eJoMiACVKAjhyo
+        CgQJYsCKQ3qx1RYndWCzHB54gk2K2OgM9PEF4DixG308iAleJ7xa+G5YXTGjhVOD7O0HeHgsbAtuIeim
+        Um5kV8gjQtAhL3DlpOkMd6Vy2PzVS9tEufLNJqbObdI5T95tRQudk9vQjRc8LeXygRyd01xcYDkA9EpY
+        Dk/PfJ1urbc3FsNSIAgcIQ6cu6Ucgn4R/BHCUu3vj7+tQLRgXSTCex+KDLDAUCgDGkLAERADVuyOw2ZE
+        7GmmB3Yl4o+EOODGAeD4YvwTdPDwPsDrBNmB+EC4ofXwMChR4Q5Aa+twHK3n67uufcSZvAgcC35uY6a3
+        XkUZ7o6OyVHDBu175+SBD87wcfCDM1ycjTk9rPt2ZbeKttS5YzqPlPy2W08YMvgE/C8cHVOcnFKdnRe7
+        uqa7uy/z8MjR6VaDoRAEDmusijX+/jWCXw3PWXBY428Z3L6+G3x9y0QgIxQAckEHoIDIoC3t98Secdpe
+        iwee0IOHG1+GvhGJCaQGmk5KgjcHCTcUCQssqlToOUG+cbqep2dah3C3Ky8t3txgz/F7yjW2OZvWH/jg
+        tGmsfq1Uvs/OrE7erUzWbb2s21pDdC2Qdc2VdV0h65Im7ZIq7ZIs7TKfQtJlniF+52cuFofa2U23s0u0
+        t5+JKR/A7ey80NV1iZvbcg+PLPgHb+81Pj7AuoTDugLkBawcvrwR4LE2UBtYs4O6oQDQAUBGR/qAyHSG
+        I38yGN0mjwdd6oq/whfgKDt8MbiP14ZXErwt8ObAdAAZQQg3wY0kHnqCyVsrqxBn5wne3tmdQLxN98Jy
+        Io1mxNj50w98cKrNCD4ebbZF1q1C2q1I2m2dtNtaabc1LLqulnbNknZZIumySNJlwSNweZRfGiv+rUV3
+        fHNb26nA2t4eWM92dJzr7LzA1XWxm9tSd3f0Q1ZhZdPr13NAb+CAJpSFQOMnN6a2CCiDktABkgvauEwQ
+        A1n+PhE6qJJOzSeswXdSEug4ryS0TvLCbQQ3TCQqghhKQrJjYxPp4jLVxKLwpGj3ibNzil9kRMPlnQfe
+        P2UaC64tNd+rMquVdSuRdlsvRFnSdZWk63JJl8XiLgvFXeaLu8wzjhcCe1pY+NvYTLK1nUxYOzgkcUCn
+        uLgwoMFonQ6MXtuiHgDalM7Cn9xAbZ0uWwSU6cw1Xi5MUebPFCOshdRuU0lIuI3gpvQSCRHcJHJ9tBdw
+        1zEQt7aOAMdxwmFnOI7f0EKqzqhY1SbK+KTrYV+zTdJu5dJuha3pnCfpminpkibukirusqANlF8ab/lb
+        iZlKNdTGZqKNDYCeBkY7OMzCCJWLC6QDGr3C05M0GnQuhuxydEbNx0g3HgGNXwq/GlYp/JoiXpSN5IIo
+        3OYVmEZwg9q8kuAF412gEG6ICWk3lko4E+TxsJWooiAvBeI4XBSqotH4Qcfd3ef5+KxpD3S8r0fPndIe
+        ysPPT+i+S2ZWzYmGkM75HJ2XdUjnoJ7m5n7W1kB5oq3tFE46QOc50A0Xl0UcnTO9vHIh0BydSTd4Oj/S
+        Dfzw+BXwi+DXwS+F6XocUYNaP7srSyjKQrno4HRMI6zpkmgoCb4VucA24aalEs6EjCCyJMg3CI7sH2Us
+        dBtwjihGBhQKG0i5o+NID4/5Pj4FPOggV3Cf6PZEY/2tCtV+B7MGabey1nQukHbNlXRd2YJym3Qea0Tn
+        qRydZ3J0TsFK6O6+nKNzPhyxXs/T2QA0fkj8qPiB8WPjh+/duzfKnJgB52vOqNyJsKYJD0rp/O3VvGoL
+        laQDuPkcB5knDCV8N1ZL0hMiOBScCoRw4mhd4mhIuEO5XKXR+MKS29kNV9vYZTesaY/OgcejzLZKu1Wa
+        rIGgc7akS4a4yyJxl5Q2RANi/YI/1DlAQGfoBug828kpmaNzBkfnVd7ehmXQ2zvf3X2hs/Mke/v++PHw
+        Q2I8E+9LOFq0SoSVZyRxVBw13NBptPR18qRXfFmbcJNwG7EbppuWShhB8t1UMyGCkz+BggsRR6kLlXE0
+        1ebMmePk5JS4IrH5nebmd/fve/fgvvcO73/v6P73ju1//8SB909OvJTUfY/crEbarZQTDZgNg9OQMDrz
+        a2ByG0C/OMrit+ZmGk18izpjGZxBdKZl0MVlnqPjNEfHBBubQVptuFLpLpOpgoKCsEEEd4+gA4VKPV/T
+        J2QJXNoRQsV9drnvD0ZZuEi2t07ycMN0w9uQEYTv5ldLnuC8ggsRh6qA48jsR88aferzU4gTn5049vtj
+        Rz46cujOoQMfHNj33r7Cm0WafVZdNpp1KTXrsq5HlzU9u64x71pggeiSa9El07LLEssuqZZdUixbOw38
+        kcX/6MzMzfVqNdp1fVWqKKUSa1egTKaXSt0lEjtLSyV6pjqdDpzFLAYmLqEJoK1wUwi/74bfbkPg8rsX
+        wBh2Lzgdz9bm0td5aneS3ZTBU5pDJSoiONw3FBy5JSQFiPMch6pg61X00OhtL28788WZM/dYnL53+lF8
+        fjrqYpS0WWpZb2m+wbxnSc8ehT3M1pmZrTXrmt+1S3aXlzJeejH1xd8t+N3v5v7ud7Nbx5zfvTDwhf96
+        6b9w/re1tTXeNJ6enjh1GvOMWCpgiiBfmAbAQYt4V6FzjT4q7bvhd4RQNV+46Ybft0D7Qmi0Hsu+iET5
+        x6PcMbt5Z0K+m9IcwA09QWmFEEeyY4o49M470LtkX8nZL84iGNZ8cKBPvTlVcVwh3y6XbZTJqmWySpms
+        QibbIJOWSaXFUmmBVJIlkayQSJZKJOksxOniR5Em7qnviZ132CIGTGfMmIHVGDKFHV3AF2dQwRFh+AKr
+        NE7sQQsbnVVADP6SJhBnhchSc4oHl3aE0L4F0dNFuQO4yZnACPIFE75ERYjzksIjjp/Sxt4mszrz3Ffn
+        zn3J4uyXZ1lwoCPWvrvW6bSTYrdC3iiX18rlVfJHQJdKpeukkhwJA3q5AWXCmg+LIRbQBOgspAkQo7CO
+        sWC4MezLw0H2QBn1A6AMoQCR8ZITxLTdBnV8PIiz1PYDbYEsHvymENoOQpsWGNBPpA9P9MVGSyWfVdJq
+        CcNDJSoQHArOSwohDu0GBMn5yee/Ps/iq/MMbgoO9MOfHw68GKg8oFQ0KRR1CkWNAkDLK+XyCrmsXCYr
+        krEx0WypFM3oZVJphnFIZkl6OveE7GILKVgMiHFIILYZYK8YGnWwPfyOUhAZSxz1VAlcIIvFg9/FRJuX
+        QFtq+MFKEbh8iwpphOiJgPthX8zDbZRV8gSnBZMkhUd8yZIl09OmX/jmAouvWRgQ50BHDH55sPqYWrVD
+        pWxQKmuVimqFokqhqFTIN8jlpXL5WrksRybDAdfLZbKlMulSqSFaEMd4OW2ZgVDggbYc/o+40AFLAkSZ
+        JzKGA+hEf0AMfEFbUgMsHli0+S1Mwr02sFIwVPxeEGz4wHv05wC6PT0Rlk1IUnjEwSZM7WO62XD3wTcX
+        DYi3gJ50O8nqjJV6t1q1WaWqU6lqVcpqpbJKqaxUKsoVikKFPE8uz5Fjr4psmYzF0lYhGS8xV5lDLkBh
+        yDH8LxQZRg2zcNjMi3UPs0TQCnSO0KujnjXhC84SYbFi0xYm1HOwhgNZ0JZ22WClIXBpCwhWILxHf1ag
+        CfE2Cc4XqoA4fsm4yXF7X9976dtLCNwwYQi6cOKbiznv57icc9Hs06ib1NiTQkCrqlkAaGWJUrlGqchV
+        KLINW1Tky+TCwNYgsa8YxVuoBPAFiwExzgPEq4sLRmAtMFEEraDD5QExNBfkBb6kBgSrcPMS31lFtZnf
+        WQNw4axgZ7ECQRV/AaDbJDifXuI3HDhmIMzco2tTOLh50Os/rfe97Ks9qNVs12gauQn+WrW6hoWqUqUq
+        V6nWq9jmlBylMlOJvUAslrcKyUAJ5jcBLpY74AsWA2LSClgLpMuQY7oKixrWuAQK+AJcLBsgLLEVrpRg
+        Jc4iFyNksaoDWQIXzgp2Fms+VPGXBNoUcahhvxH9Nl3YdPkPlxFGt9Tgj7hYrNe1XlbHrbQ7tZotOJpc
+        o9mo0dSyUFer1RVqdbFatVqlylUps5XKFW2EfIpcbCuGYkCIYSogFOTe8DaCQabjt2HRqJUKiCG4IC/w
+        RTES4PJSQFuVaIcSYEUuxiOLlQbgYtWhLiDWfKjiMwE0IQ4excbHNpxrIJSNgkAfdGOQ9Slrqz1W2iat
+        tlGrrddqN2q1dVqGdaVGXapWrVGp8lWqVSpVlkq10jhwOYI0UIorNoEvHhAK1NUw1AmtICLzt/ZCKIjF
+        aBsBX9JZkgIeU9qbRLAKkcVKQ+BS/48aVc8K0EixwOWG8w1Gl1oJ4R5za4z1WWurfVbaba1QZrfiVWs0
+        5RpcQqherVbnsms91JmtQpXJQJcPlOOqeowm40EQQytAZBhk/i5ImgmgsQtIBA0EkBTwsFLPmm9bt4ks
+        3wXEmo/HMwE0ftVBCYOYYgguaDN6PvWNqbhg2nq/NbsYDzfy0n3e3HVAWtxNj3uPizS4KJZdnpJjjDKB
+        rpyklFpLYZChxQQxEZncG13WC0WGnaDrleAZwGLwl6QW4JIOEFuFhCXOGiHLV5Ao9/7lgcavHT8lHtta
+        O0B5zltzHC84Wh/kUMZ1vHTHNI9ypZZdBNTOdbx0KZB6gVrmI8PwMSDGMDidaoOFl64X41GGY4NLo0us
+        oL901TfwpZI91ZOFmFLnmjhLbVW6CY0vbDy6h+WH5SBP5V/hF8CKNHbO2OY3mjtAGTfUszu8ceMxLhAz
+        RblKq8XF9Dh0ha62yja+GI+AlkfLsTEHEFPJgmZo6aJNpCEwcMiV+Qs0aSAAQkG3HRPEPKAdw9pepv2L
+        MRrLCzKFxIzEYx8d6wDlRe8uMkYZokFcxr1W1Vp2K/1aJhptXkxPKCvjlVKplI5nosIQncNCt2wCZSR4
+        dEcvz2WgTK1quhNBWEmmPOBJa0S/DNBY0B1cHFLXpHYAMf4KKLtddLM+LOCyKcq4hZdEw+RWekJZNUUl
+        c5DBLPMVZEKZv5BQqMvCa++e7r2ZvwDQcKn+4f659bkdo2xQDKCMux2bOF1uWQANXC7nruDtWJrnqeV6
+        OeoY/BFZUAxCGYk1qkKoBMEs89cbw8DxV07T4ia8S+XHCObPCjTegFiL+o/qX3mksmOUsfo9UozWKOPu
+        QaYYG7TawsctgBlqRYQCtWYeZVr96IY8lN9Qu4BfRrECNQrhhd104URnbhbsPPQ/H9DIrFDnnZQyae+t
+        vR2jPO2NacxjCFc/3swBZc7Msct3icsm18Lydw8q+7Fb6fl9UKjD0fV4VIcjaTa6QZruqnm6okEvxs8E
+        NOoGOn9dRkkGsruOUU64lYBbpJmT4z3GD0JZFa+SKqXIrYXSDJtBtx+jPI/EBEWiNi8UfLqi8TMBDclD
+        sot8ZMOhDR1DfOKbE4NfHYxL0Q1ZCTm59lBu857Slns0VWNVMjvDAgigycwJpRnVZKR/dMcuakPI/R57
+        RWbnVaLNr/xpGY23J9zFnMw5OJSkY5Qb7zZGXo+0OW1jvU+QlbR4DKbLQsXo0DKrpqnkrnKUQIULoJE0
+        wzUb3RqNksVPJBoGRm8oXfFTRG528tDBvcP7h+Y0ZJ387HjHsex2uvspV9k+sXSzWFJnKam0lFRYSsot
+        JWUsxCUW4kIL8VoL8SoLy5XmlsvNLZeaWy4xt0xrI8wn9uju1DUyMiBh9MCxYwaOGzt4wrghkycOmzIp
+        fsa0EbOSxsydPT5l/qRFC6dlLElcsXR2Tub8/FULCvJT169JK1qfXlKYUVq0tKx4WXnJ8qcLy0/CaJQO
+        3HRu87LnPZbIoDkMBi5Ctz5ibb3b2mqrSR2DshJ+9euQy2qYOX85+iY8l/kFEBkgSTNcM6SZbpunSVq6
+        Q+xpXczdnsKIhK9bRdlKisryzJbIqtqAyEZUVyByqitzaipXIWqrcg1RnVfHIn9jTX56WlJ0dPDAhP7r
+        d609dfeEcXx+4pQgDn66v//lWOVxuWynVNYokdVJZFUSWaVEViGRbWAhLRNLi8XSdWJpnliSJZasFEuW
+        iyUZYkm6WEqR8SgksyzNfXr2iek1d87UeXOnzZ83IyU5KXXhrCVpc5dmLMhcsSg3J31NwcriotyK8jV1
+        NUWbN23YvrV6z676/c1bDh/cfuzorhPH95w+2Xzm9IFzZw5cOHfowrnDF88fuXjhyKULRy9dPHb50vEr
+        iMsnrl4+ee3KqWtXT7189fTL185cf/nsKy+fe+X6uRuvnH/1lQuv3rh488bF11699NrNy7duXrn12pXX
+        b119/da1p8Zo1G3RrYgcGJlVm4VGaseKjL8t/bgUJ9+1Icp8tYjPsPmspH0np16kVoQrMFrImzksgHye
+        TbkJFkDMsvKuGQUNFD+NpPlppSemvH4KjF6dt3jUiP6u3s4zVyRuv7G1DSLz1G6h85QbkxxO2smaJbIm
+        iXSjRFrTQmSey6ViaZFYulYsybWUZFkauJzOuEwhZLRknqV5YM+IiOC5s6fMnQ06T0+en7hwQVLaojnp
+        S5JXLFuYk52Wn7e8cH1WWUl+deW6ho2lTZsrdu2o27u74eD+piOHth/n6Xxq/9kzB86fPfhsMRqVARQ5
+        PXw8Zi6fufXa1seyGF+w9fOtA24MsDlvw5wycmsTUWYGA1xG5RM1OaoW0UXogivQhc/Vi9WKXoqEhAQU
+        jHjLTGYOSwWfAZLNoKuhhQUNvmzUyXnlH2zyfiCjczKTRw7vZ+9iO37+2MpjGzpisUCpZ91Mcj3tLN8v
+        lW2VSOvF0hqxtFIirZBIOUVmUS6RloilhWLparEkm+PyCkvJMkueyEaMlsxlXA4PC5g9a/Kc2VOhzkya
+        FyQuSoU0z1uWkZKVuTgvd+m6NStLinIrNxTUQpoby7cxad64b++mQwe2Hj28A3Q+eXzPqVPNZ07tgzqf
+        O3vwmWA0SjDoH/sE+cxeOXvLpS2dYTG+BjYZRLY9b4vE2uAuNrfOR/iyJwwGVfE7rHyyWn4K02VMJROX
+        hYkJVTNoUoBKoEKb8VPnJm0nLJ10HUXrMhKnjw4P8/Pv5Ts7a2bjpfpTd4+3hIm7aO03JrwyjinyPk6R
+        DUQWSyvE0g1iKSiMgMGAKMNgrBVLc2EwIMqWkuWWkqXgMsUjdTY8T7Q01/eIjAyZPXMy0Xn+3OkLkmcs
+        TJkJaV4Gm7EydVV2+prVKwrXZ28oy6+pWt9YX9K0uXLndibNB/ZtPnJo29HD208cY3SG2Th9qvns6f2/
+        JKPhOtGWt7W3RcMpf1P+yd+f7CSL8WWrPlzFrMXZ1oosTKxRwheK8roWUW6/V8JKzDNV8MuY/xR6DJpA
+        JC6jZkQNQPzwKIFSnk1b/IQ2g6qgnd/k8IMFmhWV2mP0soyZSK78fT38wn2mp08pP1J68u5xYXTM6JL3
+        iqIvRqmOKWS7JbItsBZiaTUUuYXIjMssJLxTNhZlnsvGjBaPs+jp0j02NnJm0iTQmbMZUxfMn56aMnPx
+        otkZ6fNXLIfNWLI6f+n6tbAZeVWVa+s3FsM179hWvXvnxv3Nmzmnse3YkZ2g86kTe06d2At1PnN638/K
+        aJQNYSQgfAERAdMWTSveW3z23tnOUxhfuevertG3RrPOyDFr6+aWwgX1rQWtawOR0fEra6ksI+vLa7dR
+        YmiXjGV1DMwkGnEZHsOIy1TOB5dRaCbLTNtVhd2pn4fLj2od2ZnzUAeI7Rvm5mrvG+o9bl5C3uZV+99p
+        NhQoWhOZJ7Upo7d93DTq2gjIMfMV2yTSRrG0ViytEhCZYzEjcqmlpMRSsl4sKWjtLh6JchuMthxg3kNl
+        Fh/Xf2bSxFkzJ0Ga586Zkjxv+sKURMblJfNWLk/Jzlycn7d03drM0uJVlVwGuKmhbFtT1c4ddc17IM1I
+        ArfCOB87suPk8d2I0yf3smzwZ2A0NsJ5+HrETYpLK0zbeGbjY+vFbbJ77xd7J92epLussznJFTlRSoZB
+        FvqKlnzvUVO1vKV4/zinzAxGhhpVfNSX0foT1jEo9yO/TAOfNCpnxGXTTuvPyWUDo1GUaH5rT0fVtQ4Z
+        XfF++ZArgxxO2Mn2S2TbxYzFda1Z3CLHBiIXg8iWkgJLsdAmZxjxt9UfxTMszf17BAbop0waxXF54pxZ
+        k+cxLk9buCBxcSq4PHfFMuJyxlpY5uKcivKC2ur1jSwDrIQ0t7hmRmc4jeNHeXWG3/i5GP1E+iv84oI7
+        BZiEY509aDGKyB2yuJUiUxeqE0SmHja6q3zfjzbqoPWHphS1Syj3w9gnHTzSJpf5ytxT3Bn1pA5E9Nhi
+        sZHZ2PHRtmmvTPE56y0/KpXuFku3iKX1ltJaS6bFZI0pWuSYERlyDCKvs5SsBpEtxJkW4hWWYuR7HRIZ
+        9tkCoqwxGzQwOmnG+KTE8QYuz52SPH86ShmLU2cxLi9Nyc5q4XJRzoay1bXVqGaUbNm8YXtT1a6dTJoP
+        7t986ACchoHOYDTUmfMbzySj8+7kDX11qMclD5tTzBezBG8bNzoER8FbY4EWG+QYnREqXNAABqxFh7UL
+        wwQXsr5oBaZeeFGmm5747TqoL2NsATU5dLJpyIg/eER4JMazwGWDRj+W0flv5Q7DxcGnXGRHJIzCTWJJ
+        vSX6INIqS2mFpXQDF+WI1iwmX1FoKVljKcmzZCxeCSJbiJdZiDMsxEssERKEIfFr9cRytHlPt+4RYQHT
+        piYkzRhn4PLsSfPAZYPHmJWRPo/pctai/NwMrpSRXVEOLq+tryvewgrNVbt21DbvbtjfvAl0PnyQjDMz
+        G/DOXDb4bDD6zLdnVt9ZDTvsf8WfVdqOClTYlMKtWfxIjuErULXAVBw/F9DOMBFfjWPuYrBSZivDoDjv
+        lIWijMEXMhjUxkZ9mT9zi06DotzPdJrrSSe4nlSCH/v1rTS69L3i6TemRpwPtT9hKzvcwt8GS0mtpaS6
+        pZW3gevmMQpzUdbyBIwu4+S4iJPjfF6OLcTLLcRLwWJhtMFoy/HmPb17BAR4j00YNmN6QuL0sTOZLk+Y
+        M3vy/DlTFyQj90tasnj20vR5K1csXJW9eHUecr8VJUWrKjasrmG6DC7DMleCy3t31+/b23CA0RlOo+no
+        YVbWOH4UhTrmN34ZRpd9Ujb3rbnwD75XfNkA8nFrpr97uYwOXrhN/oLC7bEYtbeSljoyZXooJbcz4dmK
+        yEOVmJDDcUBEZOE2YMr6+IMQ6axJMhiYMKJZcTpzy/R4l6e+L/ixzG23Zyg7LJbuEUthgdGBJvJWCcjb
+        wl9isSG45jTjMp6UWhi0eC2nxQZT0cLidCMi8398xGjLBPOeuu5+vl6jRw6ePm0MuAxdnpk0fs6siVzi
+        Ny1lwYzFqTOXpM1ZvjQ5c+XCVTlpBfnLCtdxud+G/NoqA5e3bqnYuZ1Z5uY9aANuOrBv0+EDTVweuJXU
+        +RdmdBvMpYqEaXDDsnywPgg5ChQrYI1JizvNYiooI9+T2cjopj1TItO5qej4wSnTHjQ6CBGz4uhhYyKf
+        ihg0yGx65tZPuin4SaktkoCzbdLWhMI0ZcGVKSwkRRaSdRaSAjZrwRwFAkJMjqJdFgvYnWZpMbhnD0ez
+        4CCfcQnDGJGnjeFEedxsiPIsZjAWzJ+WujAxbREzGCuXL8jOhMFIX1uwvGh9ZlkJ2iXMLzfWF29phC6j
+        AQguo9BMBQ20TrYgjjA6Q50NfuOXZnSb5DVVYeqAEIVhJ3gh5h1F+209o3Yfkj1FiALnNGAzpZG14O/p
+        5ImM8gV/bip/ECJEuTMnmz0p6X7Srxe1El9iMTG3JdigULGFuIibFVptIc4xF2dyAVNMdqIzFOYsh+Vk
+        854h3buLu8VEh06dMmra1NHgciJEOXHcrMTxs2dOnDdncvL8qakpMxalzkyHKC9LzlqxMJeJcgZnMJD4
+        5VZXFtTVol1CHqNiJ6sy13BchjQzOpNxZt75GWW0qQTTZEUFy+vYMDKvwjQs2wk78chXzOPk2F6GPX7Y
+        d8bLsfA8dlgLOiycTrIWHgAsPDe1Y1F+pnRZ+BYRteJvqaWBvDTrlm9hucrcMtOcTbytMBcvNxcvMxdn
+        mIvTzcVp5q19cXvuwsIy0dy8d4/uVt0CA71HjhwwdTKIPGr61NEzpo9J4pwyRHnunEnJ86YsTJ6+aGFS
+        etrs5UvhlBesyl6Un7dkbcEyTpRzKpjBQOJXuKmhuGlz+fat8BhI/2ogzc170DdBEth4YF8jV9Zg3vnZ
+        YzSJL09eWAjoL/Xu+NIE2eHH5XVGWoxJOOUApcxZhjNzsLuPWCy8nJo/ZATJHgbjcEIDv72dTrLmiUzl
+        C6NzU5/KaVA/qS63YrR4nYUY5iHPwjKHYy5HXjaxSUObGeaW6YahTcZiYbTK9Fox2mJiz57h3buru/n7
+        ecUN6ztl0oipk0dOmzJqBog8LSFxBucuZk2YByLPn7pwwfRFqSDyrGUZczOXp+Rkpebnpq0pWFq4bmVp
+        cVZFWW5V5eqNNej7FW5uQBubcXnHtiroMknzvj1IAuvBZU6dmUA/o4w2MJfMAy++IO/j0rk2R4dUk1WY
+        G5JZyXAAKXrnbbIYdWT0RIR3N/AXC9D2a9rhzh9NKyQybakUdq+fWVE2eq+IGG155raQt83R4w4YbTnb
+        3HxAj+7u3RwcrCPC/MeMHDR50nCeyFDkRCjyjLGzZ46bM3vivLmTFoDIKTPSQOQls5dlcIqctTAvJ23t
+        6qXr1y0vKcoqL82pgihXr9lYC7NctKWxdOuW8u1N4DJKGQabwei8t37/XqgzzMazz+gfxFyezhivV/Zl
+        QoxrnnDsE09hOrCMv+GFDtQiFtOtAuiJ0GkjGCOioxroHAHyyGQt+NoFT2S0SJ6d8sUT6buoTfI+ltEW
+        U3v27NO9u2u3bt26BAV6DxvaZ9L4+MkT4idPHDFl8ohpU0bCWsyYNjpxxphZSePmzBo/b/ak+XOnLFww
+        bdHCGUsWJ2UsYdYia0XyqmxekZcXF2aWl6J8kVdTVVBXs7YRotxY0rSJuIypjMpd25k079lFrhk1DczP
+        PUeMbmdKs00JhpHAbidFoEKmYefI4igiYWpHFKZ7oCDE8MX8PUX8PTp0szpqb5hTFsoxqha0yZ0/R0B4
+        JPvzS2Se9Z1itMXEHoy/7t3MLLt6eTpHRwWPGTVw4vi4iRPiJk2IY3I8eThYPGMaY3FSYsKspLGzZ42f
+        O3vi/LmTU5KnpKZMX7KIM8gZc1cun5+dmZKbvWh13pJ1azIK1yHfA5FzKjesqq5YXVe9pmHj+s0NRVs2
+        FYPL25qIyxXg8q4dVXsYnVFrRvyKGK1OVavGqZR9lHJPOXp3dA4ynckJ/SUJ5o+SpTMjicL8yXB0chnm
+        7FE+RiuEtBiFNzIVqL1h3z3JMfkKtEXoKIE297k/kSA+g1/citEWST3Nh3fvGWEG8TUTd3VysgkM0PXv
+        FzF+7JAJ44ZOHD904oRhkybGTWmh8PSpjMUQ4pkzwGJOi+dMTJ43KSV56qKF09NSEzl3PHvl8nlZK5Hp
+        pa7OXbxmdfq6NUuL168oLc6sKAORc2sqV9fVrKmv40SZ4/LWzdDlsu1N5eDyTtB5R9Vu5jSqn29Gwzao
+        4pj5ZcxVSR97DjJ/LCfPX8rroMLoSROF6XA4OryMvw0KrRA6+cmIxXQJCX9DhtGBDc8gN3/YjySytVZ7
+        ejiFhuj79wtPGDVwPLcxz0Be8HcC+BsPCZ46efj0qSOmc14iCRROTIApxp69eXMmcBRmjmJxKuco0mcu
+        XzoHLM5mLF64OndRQX4aJ8fLS4tWlpdkbSjDHi9Yi3yOyOsaN8IpF25phFkuAZe3NTEub99aDi7v3A6n
+        AeP8q2A06md0ayR/wjR/fSR/Wq/wHGQ69pRO5qTDDenkSFJhnsK8EMMXo1JBh2uRNeav0hG6Y35O+XnJ
+        9J6U16KJE4ZOmjAMe0snM/GNnzqJkXfaFJCX09/p4O9ojr9j58waN2/O+OR5ExfMIy8xLS11evriRFAY
+        Qrxi2dyslfNzshbk5izMz11csDptXUFG0bplJUWQ45UbSjF3AV+RV1sFRS6or2WivKl+/SaIcmNR02Zw
+        mdGZuLxjK5zGhl8bo5GzQW07fw4yHXuKiU3iL2psdP4emni8CmO+gg405C/covO1yFHwV+n86lncqno3
+        Y9rIxOmIUTNxunsSErmEObPGzp09bh7pL6tLTF64APydmrZo+pLFM9KXJC1Ln7Vi6ZxM5iXm5WQlrwKF
+        V6UW5IHCS9avzShav7S4cHlpCViM2hvkGNts2b7auurVIHJD3dqGjevA5c2NnC4zj1GydUvpNhYGdf51
+        Mhpu94nOQUaNGEUJHPJE50eSBJOR4I/gEx4VKRTiX6uj6Ixei+bPhW2YsGD+xJTkSakLJi9aOGXxwhby
+        piUuTZ+1fOmsFctmZy6fmw3+ZoK/KXmrmJdYw1Q4bf2a9MJ18MXLSgpXlBGLyxmLq9l+cShy3sYaVJML
+        GurWwF1sqmdc3tSwnuNyURPSP1LnfwVGP+k5yMKjeukISTo/kr+TT6jC/8oUNq5HL12SuCwjaXnGzBVL
+        Z61chiwO4suRF+KbvSA3OyU/d+HqvNQ1+YvWrl7MqfAS7DksXr+0tGh5WTF88coNZVmV5YgcdvZBRW4N
+        Tj2AItfk19fCXTAuI4jLmxsQqMmROv+LMfpJz0EW6q/QRfAdvH8pL9EZdTbMR+OomLyc5LxVC3AQy+rc
+        hQV58A+pHHmhv0yCib/FhcvKikHhFeXsxBqc6YEDPcBi7hwPw/EdhlM7DFyuM3C5cSOKGLDM//KMplt7
+        O38OstGxp8IDTzv/8v4LfqVoHaNtWuHaJYiidenF6zOKuXOFuGAsxulCTIhL6ViarMoNWZwWG86hYUfR
+        CE6gYR6jFn65oP7fjDY6geZJz0H+xUfnn9N3g6ikcCmCKMyRlwU2iLecr0SHKzFf0Zkzlf7N6HbPVGrv
+        eOlfaxXtl3pDiHgKC1j8w08J+zejf/JTwn4ppjwv/98feKZSe+fe/ZvR/2b0L0z9fzP65zrd4Bd+of9l
+        /vf/ZvS/Gf3rIvu/Gf1vRv+6GP3/AZ+4Ui+mkTlKAAAAAElFTkSuQmCC
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/App.ico b/src/ProjectEditor/editor/App.ico
similarity index 100%
copy from src/GuiRunner/nunit-gui-exe/App.ico
copy to src/ProjectEditor/editor/App.ico
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs
new file mode 100644
index 0000000..ea62d2e
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.ProjectEditor
+{
+    partial class AddConfigurationDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.Container components = null;
+
+        /// <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.configurationNameTextBox = new System.Windows.Forms.TextBox();
+            this.okButton = new System.Windows.Forms.Button();
+            this.cancelButton = new System.Windows.Forms.Button();
+            this.configurationComboBox = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // configurationNameTextBox
+            // 
+            this.configurationNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.configurationNameTextBox.Location = new System.Drawing.Point(16, 24);
+            this.configurationNameTextBox.Name = "configurationNameTextBox";
+            this.configurationNameTextBox.Size = new System.Drawing.Size(254, 22);
+            this.configurationNameTextBox.TabIndex = 0;
+            // 
+            // okButton
+            // 
+            this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+            this.okButton.Location = new System.Drawing.Point(50, 120);
+            this.okButton.Name = "okButton";
+            this.okButton.Size = new System.Drawing.Size(76, 23);
+            this.okButton.TabIndex = 2;
+            this.okButton.Text = "OK";
+            // 
+            // cancelButton
+            // 
+            this.cancelButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cancelButton.Location = new System.Drawing.Point(155, 120);
+            this.cancelButton.Name = "cancelButton";
+            this.cancelButton.Size = new System.Drawing.Size(75, 23);
+            this.cancelButton.TabIndex = 3;
+            this.cancelButton.Text = "Cancel";
+            // 
+            // configurationComboBox
+            // 
+            this.configurationComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.configurationComboBox.ItemHeight = 16;
+            this.configurationComboBox.Location = new System.Drawing.Point(16, 80);
+            this.configurationComboBox.Name = "configurationComboBox";
+            this.configurationComboBox.Size = new System.Drawing.Size(256, 24);
+            this.configurationComboBox.TabIndex = 1;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(16, 8);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(248, 16);
+            this.label1.TabIndex = 4;
+            this.label1.Text = "Configuration Name:";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(16, 63);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(240, 17);
+            this.label2.TabIndex = 5;
+            this.label2.Text = "Copy Settings From:";
+            // 
+            // AddConfigurationDialog
+            // 
+            this.AcceptButton = this.okButton;
+            this.CancelButton = this.cancelButton;
+            this.ClientSize = new System.Drawing.Size(280, 149);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.configurationComboBox);
+            this.Controls.Add(this.cancelButton);
+            this.Controls.Add(this.okButton);
+            this.Controls.Add(this.configurationNameTextBox);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Name = "AddConfigurationDialog";
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "New Configuration";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+        #endregion
+
+        private System.Windows.Forms.Button okButton;
+        private System.Windows.Forms.Button cancelButton;
+        private System.Windows.Forms.TextBox configurationNameTextBox;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.ComboBox configurationComboBox;
+
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.cs b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.cs
new file mode 100644
index 0000000..71b1ac5
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.cs
@@ -0,0 +1,99 @@
+// ****************************************************************
+// 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.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+	/// <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 doc.
+    /// 
+    /// A DialogResult of DialogResult.OK indicates that the
+    /// configuration was added successfully.
+    /// </summary>
+	public partial class AddConfigurationDialog : System.Windows.Forms.Form, IAddConfigurationDialog
+	{
+        private static readonly string NONE_SELECTED = "<none>";
+
+		#region Constructor
+
+		public AddConfigurationDialog()
+		{ 
+			InitializeComponent();
+
+            okButtonWrapper = new ButtonElement(okButton);
+        }
+
+		#endregion
+
+		#region Properties
+
+        private MessageDisplay mbox = new MessageDisplay("Add Configuration");
+        public IMessageDisplay MessageDisplay { get { return mbox; } }
+
+        private string[] configList;
+        public string[] ConfigList 
+        {
+            get { return configList; }
+            set 
+            { 
+                configList = value;
+
+                configurationComboBox.Items.Clear();
+                configurationComboBox.Items.Add(NONE_SELECTED);
+                configurationComboBox.SelectedIndex = 0;
+
+                foreach (string config in configList)
+                    configurationComboBox.Items.Add(config);
+            } 
+        }
+
+		public string ConfigToCreate 
+        {
+            get { return configurationNameTextBox.Text; }
+        }
+
+		public string ConfigToCopy 
+        {
+            get 
+            { 
+                string config = (string)configurationComboBox.SelectedItem;
+                return config == NONE_SELECTED ? null : config;
+            }
+            set 
+            {
+                string config = string.IsNullOrEmpty(value) ? NONE_SELECTED : value;
+                configurationComboBox.SelectedItem = config;
+            }
+        }
+
+        private ICommand okButtonWrapper;
+        public ICommand OkButton 
+        {
+            get { return okButtonWrapper; }
+        }
+
+		#endregion
+    }
+
+    public interface IAddConfigurationDialog : IDialog
+    {
+        string[] ConfigList { get; set; }
+
+        string ConfigToCreate { get; }
+        string ConfigToCopy { get; }
+
+        ICommand OkButton { get; }
+    }
+}
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.resx b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.resx
similarity index 100%
copy from src/GuiComponents/UiKit/TestPropertiesDialog.resx
copy to src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.resx
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs
new file mode 100644
index 0000000..88095f7
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs
@@ -0,0 +1,63 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor
+{
+    public class AddConfigurationPresenter
+    {
+        private IProjectModel model;
+        private IAddConfigurationDialog dlg;
+
+        public AddConfigurationPresenter(IProjectModel model, IAddConfigurationDialog dlg)
+        {
+            this.model = model;
+            this.dlg = dlg;
+
+            dlg.ConfigList = model.ConfigNames;
+
+            dlg.OkButton.Execute += delegate
+            {
+                if (dlg.ConfigToCreate == string.Empty)
+                {
+                    dlg.MessageDisplay.Error("No configuration name provided");
+                    return;
+                }
+
+                foreach (string config in model.ConfigNames)
+                {
+                    if (config == dlg.ConfigToCreate)
+                    {
+                        dlg.MessageDisplay.Error("A configuration with that name already exists");
+                        return;
+                    }
+                }
+
+                IProjectConfig newConfig = model.AddConfig(dlg.ConfigToCreate);
+
+                if (dlg.ConfigToCopy != null)
+                {
+                    IProjectConfig copyConfig = model.Configs[dlg.ConfigToCopy];
+                    if (copyConfig != null)
+                    {
+                        newConfig.BasePath = copyConfig.BasePath;
+                        newConfig.BinPathType = copyConfig.BinPathType;
+                        if (newConfig.BinPathType == BinPathType.Manual)
+                            newConfig.PrivateBinPath = copyConfig.PrivateBinPath;
+                        newConfig.ConfigurationFile = copyConfig.ConfigurationFile;
+                        newConfig.RuntimeFramework = copyConfig.RuntimeFramework;
+
+                        foreach (string assembly in copyConfig.Assemblies)
+                            newConfig.Assemblies.Add(assembly);
+                    }
+                }
+
+                dlg.Close();
+            };
+        }
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditor.cs b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditor.cs
new file mode 100644
index 0000000..c351af4
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditor.cs
@@ -0,0 +1,132 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor
+{
+    public class ConfigurationEditor
+    {
+        #region Instance Variables
+
+        private IProjectModel model;
+        private IConfigurationEditorDialog view;
+
+        #endregion
+
+        #region Constructor
+
+        public ConfigurationEditor(IProjectModel model, IConfigurationEditorDialog view)
+        {
+            this.model = model;
+            this.view = view;
+
+            UpdateConfigList();
+
+            view.AddCommand.Execute += AddConfig;
+            view.RemoveCommand.Execute += RemoveConfig;
+            view.RenameCommand.Execute += RenameConfig;
+            view.ActiveCommand.Execute += MakeActive;
+
+            view.ConfigList.SelectionChanged += SelectedConfigChanged;
+        }
+
+        #endregion
+
+        #region Command Event Handlers
+
+        public void AddConfig()
+        {
+            IAddConfigurationDialog dlg = view.AddConfigurationDialog;
+            new AddConfigurationPresenter(model, dlg);
+
+            dlg.ShowDialog();
+
+            UpdateConfigList();
+        }
+
+        public void RenameConfig()
+        {
+            string oldName = view.ConfigList.SelectedItem;
+            if (oldName.EndsWith(" (active)"))
+                oldName = oldName.Substring(0, oldName.Length - 9);
+
+            IRenameConfigurationDialog dlg = view.RenameConfigurationDialog;
+            new RenameConfigurationPresenter(model, dlg, oldName);
+
+            dlg.ShowDialog();
+
+            UpdateConfigList();
+        }
+
+        public void RemoveConfig()
+        {
+            model.RemoveConfigAt(view.ConfigList.SelectedIndex);
+
+            UpdateConfigList();
+        }
+
+        public void MakeActive()
+        {
+            model.ActiveConfigName = view.ConfigList.SelectedItem;
+
+            UpdateConfigList();
+        }
+
+        public void SelectedConfigChanged()
+        {
+            int index = view.ConfigList.SelectedIndex;
+
+            view.AddCommand.Enabled = true;
+            view.ActiveCommand.Enabled = index >= 0 && model.Configs[index].Name != model.ActiveConfigName;
+            view.RenameCommand.Enabled = index >= 0;
+            view.RemoveCommand.Enabled = index >= 0;
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private void UpdateConfigList()
+        {
+            string selectedConfig = view.ConfigList.SelectedItem;
+            if (selectedConfig != null && selectedConfig.EndsWith(" (active)"))
+                selectedConfig = selectedConfig.Substring(0, selectedConfig.Length - 9);
+            int selectedIndex = -1;
+            int activeIndex = -1;
+
+            int count = model.Configs.Count;
+            string[] configList = new string[count];
+
+            for (int index = 0; index < count; index++)
+            {
+                string config = model.Configs[index].Name;
+
+                if (config == model.ActiveConfigName)
+                    activeIndex = index;
+                if (config == selectedConfig)
+                    selectedIndex = index;
+
+                configList[index] = config;
+            }
+
+            if (activeIndex >= 0)
+                configList[activeIndex] += " (active)";
+
+            view.ConfigList.SelectionList = configList;
+
+            view.ConfigList.SelectedIndex = selectedIndex > 0
+                ? selectedIndex
+                : configList.Length > 0
+                    ? 0 : -1;
+
+            SelectedConfigChanged();
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.Designer.cs b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.Designer.cs
new file mode 100644
index 0000000..903000c
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.Designer.cs
@@ -0,0 +1,139 @@
+namespace NUnit.ProjectEditor
+{
+    partial class ConfigurationEditorDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.Container components = null;
+
+        /// <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()
+        {
+            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ConfigurationEditorDialog));
+            this.configListBox = new System.Windows.Forms.ListBox();
+            this.removeButton = new System.Windows.Forms.Button();
+            this.renameButton = new System.Windows.Forms.Button();
+            this.closeButton = new System.Windows.Forms.Button();
+            this.addButton = new System.Windows.Forms.Button();
+            this.activeButton = new System.Windows.Forms.Button();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.SuspendLayout();
+            // 
+            // configListBox
+            // 
+            this.helpProvider1.SetHelpString(this.configListBox, "Selects the configuration to operate on.");
+            this.configListBox.ItemHeight = 16;
+            this.configListBox.Location = new System.Drawing.Point(8, 8);
+            this.configListBox.Name = "configListBox";
+            this.helpProvider1.SetShowHelp(this.configListBox, true);
+            this.configListBox.Size = new System.Drawing.Size(168, 212);
+            this.configListBox.TabIndex = 0;
+            // 
+            // removeButton
+            // 
+            this.helpProvider1.SetHelpString(this.removeButton, "Removes the selected configuration");
+            this.removeButton.Location = new System.Drawing.Point(192, 8);
+            this.removeButton.Name = "removeButton";
+            this.helpProvider1.SetShowHelp(this.removeButton, true);
+            this.removeButton.Size = new System.Drawing.Size(96, 32);
+            this.removeButton.TabIndex = 1;
+            this.removeButton.Text = "&Remove";
+            // 
+            // renameButton
+            // 
+            this.helpProvider1.SetHelpString(this.renameButton, "Allows renaming the selected configuration");
+            this.renameButton.Location = new System.Drawing.Point(192, 48);
+            this.renameButton.Name = "renameButton";
+            this.helpProvider1.SetShowHelp(this.renameButton, true);
+            this.renameButton.Size = new System.Drawing.Size(96, 32);
+            this.renameButton.TabIndex = 2;
+            this.renameButton.Text = "Re&name...";
+            // 
+            // closeButton
+            // 
+            this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.helpProvider1.SetHelpString(this.closeButton, "Closes this dialog");
+            this.closeButton.Location = new System.Drawing.Point(192, 216);
+            this.closeButton.Name = "closeButton";
+            this.helpProvider1.SetShowHelp(this.closeButton, true);
+            this.closeButton.Size = new System.Drawing.Size(96, 32);
+            this.closeButton.TabIndex = 4;
+            this.closeButton.Text = "Close";
+            // 
+            // addButton
+            // 
+            this.helpProvider1.SetHelpString(this.addButton, "Allows adding a new configuration");
+            this.addButton.Location = new System.Drawing.Point(192, 88);
+            this.addButton.Name = "addButton";
+            this.helpProvider1.SetShowHelp(this.addButton, true);
+            this.addButton.Size = new System.Drawing.Size(96, 32);
+            this.addButton.TabIndex = 5;
+            this.addButton.Text = "&Add...";
+            // 
+            // activeButton
+            // 
+            this.helpProvider1.SetHelpString(this.activeButton, "Makes the selected configuration active");
+            this.activeButton.Location = new System.Drawing.Point(192, 128);
+            this.activeButton.Name = "activeButton";
+            this.helpProvider1.SetShowHelp(this.activeButton, true);
+            this.activeButton.Size = new System.Drawing.Size(96, 32);
+            this.activeButton.TabIndex = 6;
+            this.activeButton.Text = "&Make Active";
+            // 
+            // ConfigurationEditor
+            // 
+            this.AcceptButton = this.closeButton;
+            this.CancelButton = this.closeButton;
+            this.ClientSize = new System.Drawing.Size(297, 267);
+            this.ControlBox = false;
+            this.Controls.Add(this.activeButton);
+            this.Controls.Add(this.addButton);
+            this.Controls.Add(this.closeButton);
+            this.Controls.Add(this.renameButton);
+            this.Controls.Add(this.removeButton);
+            this.Controls.Add(this.configListBox);
+            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.Name = "ConfigurationEditor";
+            this.helpProvider1.SetShowHelp(this, false);
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Configuration Editor";
+            this.ResumeLayout(false);
+
+        }
+        #endregion
+
+        private System.Windows.Forms.ListBox configListBox;
+        private System.Windows.Forms.Button removeButton;
+        private System.Windows.Forms.Button renameButton;
+        private System.Windows.Forms.Button addButton;
+        private System.Windows.Forms.Button activeButton;
+        private System.Windows.Forms.HelpProvider helpProvider1;
+        private System.Windows.Forms.Button closeButton;
+
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.cs b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.cs
new file mode 100644
index 0000000..3e0e440
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.cs
@@ -0,0 +1,102 @@
+// ****************************************************************
+// 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.IO;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// ConfigurationEditor form is designed for adding, deleting
+	/// and renaming configurations from a doc.
+	/// </summary>
+	public partial class ConfigurationEditorDialog : System.Windows.Forms.Form, IConfigurationEditorDialog
+    {
+        #region Instance Variables
+
+        private ICommand addCommand;
+        private ICommand removeCommand;
+        private ICommand renameCommand;
+        private ICommand activeCommand;
+
+        private ISelectionList configList;
+
+        private IMessageDisplay messageDisplay;
+
+        #endregion
+
+        #region Constructor
+
+        public ConfigurationEditorDialog()
+		{
+			InitializeComponent();
+
+            addCommand = new ButtonElement(addButton);
+            removeCommand = new ButtonElement(removeButton);
+            renameCommand = new ButtonElement(renameButton);
+            activeCommand = new ButtonElement(activeButton);
+
+            configList = new ListBoxElement(configListBox);
+
+            messageDisplay = new MessageDisplay("NUnit Configuration Editor");
+		}
+
+		#endregion
+
+        #region IConfigurationEditorDialog Members
+
+        #region Properties
+
+        public ICommand AddCommand 
+        {
+            get { return addCommand; }
+        }
+
+        public ICommand RemoveCommand 
+        {
+            get { return removeCommand; }
+        }
+
+        public ICommand RenameCommand 
+        {
+            get { return renameCommand; }
+        }
+
+        public ICommand ActiveCommand 
+        {
+            get { return activeCommand; }
+        }
+
+        public ISelectionList ConfigList 
+        {
+            get { return configList; }
+        }
+
+        public IAddConfigurationDialog AddConfigurationDialog
+        {
+            get { return new AddConfigurationDialog(); }
+        }
+
+        public IMessageDisplay MessageDisplay 
+        {
+            get { return messageDisplay; }
+        }
+        
+        public IRenameConfigurationDialog RenameConfigurationDialog
+        {
+            get { return new RenameConfigurationDialog(); }
+        }
+
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.resx b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.resx
new file mode 100644
index 0000000..262d09c
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.resx
@@ -0,0 +1,146 @@
+<?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>
+  <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="$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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        ////////////////////////////////////////qqqqqv///6qq/5mZmZn//6qqqqr///+qqvmZmZmZ
+        n/+qqqqq///6qqqZmf//mZn//6qv////+qqqmZ////mZ//+qr////6qqqpmf///5mf//qq////+qqqqZ
+        n///+Zn//6qv///6qqqqmZ////mZ//+qr///+qqqqpmf///5mf//qq///6qq+qqZn///+Zn//6qv//qq
+        qvqqmZ////mZ//+qr//6qq/6qpmf///5mf//qq//qqqv+qqZn///+Zn//6qv/6qq//qZmZmf+ZmZmf+q
+        r/qqqv/6mZmZn/mZmZn/qq/6qq//+qr//////////6qvqqqv//qq//////////+qqqqq///6qv//////
+        ////qqqqqv//+qr//////////6qqqq////qq/////////6qqqqqv/6qqqqqv//////+qqqqq//+qqqqq
+        r///////qqqqqv//qqqqqq//////////////////////////////////////////////////////////
+        ////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA
+        AACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AGZmZmZmZmZmZmZmZmZm
+        Zmb/////////////////////qqr/qv+Zn//6r/qq+f/5//qv+qr5//n/+q+qqvn/+f/6r6+q+f/5//qq
+        r6qZn5mf+qqvqv////+qqvqqr///////////////////////////////////////////////AAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/IConfigurationEditorView.cs b/src/ProjectEditor/editor/ConfigurationEditor/IConfigurationEditorView.cs
new file mode 100644
index 0000000..79e1a92
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/IConfigurationEditorView.cs
@@ -0,0 +1,24 @@
+// ****************************************************************
+// 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.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public interface IConfigurationEditorDialog : IDialog
+    {
+        ICommand AddCommand { get; }
+        ICommand RenameCommand { get; }
+        ICommand RemoveCommand { get; }
+        ICommand ActiveCommand { get; }
+
+        ISelectionList ConfigList { get; }
+
+        IAddConfigurationDialog AddConfigurationDialog { get; }
+        IRenameConfigurationDialog RenameConfigurationDialog { get; }
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.Designer.cs b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.Designer.cs
new file mode 100644
index 0000000..19d2859
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.Designer.cs
@@ -0,0 +1,84 @@
+namespace NUnit.ProjectEditor
+{
+    partial class RenameConfigurationDialog
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.Container components = null;
+
+        /// <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.configurationNameTextBox = new System.Windows.Forms.TextBox();
+            this.okButton = new System.Windows.Forms.Button();
+            this.cancelButton = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // configurationNameTextBox
+            // 
+            this.configurationNameTextBox.Location = new System.Drawing.Point(16, 16);
+            this.configurationNameTextBox.Name = "configurationNameTextBox";
+            this.configurationNameTextBox.Size = new System.Drawing.Size(264, 22);
+            this.configurationNameTextBox.TabIndex = 0;
+            // 
+            // okButton
+            // 
+            this.okButton.Location = new System.Drawing.Point(56, 48);
+            this.okButton.Name = "okButton";
+            this.okButton.Size = new System.Drawing.Size(75, 24);
+            this.okButton.TabIndex = 1;
+            this.okButton.Text = "OK";
+            // 
+            // cancelButton
+            // 
+            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cancelButton.Location = new System.Drawing.Point(160, 48);
+            this.cancelButton.Name = "cancelButton";
+            this.cancelButton.Size = new System.Drawing.Size(75, 24);
+            this.cancelButton.TabIndex = 2;
+            this.cancelButton.Text = "Cancel";
+            // 
+            // RenameConfigurationDialog
+            // 
+            this.AcceptButton = this.okButton;
+            this.CancelButton = this.cancelButton;
+            this.ClientSize = new System.Drawing.Size(291, 79);
+            this.Controls.Add(this.cancelButton);
+            this.Controls.Add(this.okButton);
+            this.Controls.Add(this.configurationNameTextBox);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Name = "RenameConfigurationDialog";
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Rename Configuration";
+            this.ResumeLayout(false);
+
+        }
+        #endregion
+
+        private System.Windows.Forms.Button okButton;
+        private System.Windows.Forms.Button cancelButton;
+        private System.Windows.Forms.TextBox configurationNameTextBox;
+
+    }
+}
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.cs b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.cs
new file mode 100644
index 0000000..b351ed0
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.cs
@@ -0,0 +1,75 @@
+// ****************************************************************
+// 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.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+	/// <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 partial class RenameConfigurationDialog : System.Windows.Forms.Form, IRenameConfigurationDialog
+    {
+        #region Instance Variables
+
+        private ITextElement configurationName;
+        private ICommand okButtonWrapper;
+        private IMessageDisplay messageDisplay;
+
+        #endregion
+
+        #region Constructor
+
+        public RenameConfigurationDialog()
+		{
+			InitializeComponent();
+
+            configurationName = new TextElement(configurationNameTextBox);
+            okButtonWrapper = new ButtonElement(okButton);
+
+            messageDisplay = new MessageDisplay("Rename Configuration");
+        }
+
+		#endregion
+
+		#region IRenameConfigurationDialogMembers
+
+		public ITextElement ConfigurationName 
+        {
+            get { return configurationName; }
+        }
+
+        public ICommand OkButton 
+        {
+            get { return okButtonWrapper; }
+        }
+
+		#endregion
+
+        #region IView Members
+
+        public IMessageDisplay MessageDisplay 
+        {
+            get { return messageDisplay; }
+        }
+
+        #endregion
+    }
+
+    public interface IRenameConfigurationDialog : IDialog
+    {
+        ITextElement ConfigurationName { get; }
+        ICommand OkButton { get; }
+    }
+}
diff --git a/src/GuiComponents/UiKit/RenameConfigurationDialog.resx b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.resx
similarity index 100%
copy from src/GuiComponents/UiKit/RenameConfigurationDialog.resx
copy to src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.resx
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs
new file mode 100644
index 0000000..af7c222
--- /dev/null
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs
@@ -0,0 +1,49 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor
+{
+    public class RenameConfigurationPresenter
+    {
+        private IProjectModel model;
+        private IRenameConfigurationDialog dlg;
+        private string originalName;
+
+        public RenameConfigurationPresenter(IProjectModel model, IRenameConfigurationDialog dlg, string originalName)
+        {
+            this.model = model;
+            this.dlg = dlg;
+            this.originalName = originalName;
+
+            dlg.ConfigurationName.Text = originalName;
+            dlg.ConfigurationName.Select(0, originalName.Length);
+
+            dlg.ConfigurationName.Changed += delegate
+            {
+                string text = dlg.ConfigurationName.Text;
+                dlg.OkButton.Enabled = text != string.Empty && text != originalName;
+            };
+
+            dlg.OkButton.Execute += delegate
+            {
+                string newName = dlg.ConfigurationName.Text;
+
+                foreach (string existingName in model.ConfigNames)
+                {
+                    if (existingName == newName)
+                    {
+                        dlg.MessageDisplay.Error("A configuration with that name already exists");
+                        return;
+                    }
+                }
+
+                model.Configs[originalName].Name = newName;
+            };
+        }
+    }
+}
diff --git a/src/ProjectEditor/editor/Delegates.cs b/src/ProjectEditor/editor/Delegates.cs
new file mode 100644
index 0000000..77e0d8b
--- /dev/null
+++ b/src/ProjectEditor/editor/Delegates.cs
@@ -0,0 +1,16 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor
+{
+    public delegate void ActionDelegate();
+
+    public delegate void CommandDelegate();
+
+    public delegate bool ActionStartingDelegate();
+}
diff --git a/src/ProjectEditor/editor/IDialog.cs b/src/ProjectEditor/editor/IDialog.cs
new file mode 100644
index 0000000..9f664d3
--- /dev/null
+++ b/src/ProjectEditor/editor/IDialog.cs
@@ -0,0 +1,21 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// Common interface implemented by all modal dialog views used in
+    /// the ProjectEditor application
+    /// </summary>
+    public interface IDialog : IView
+    {
+        DialogResult ShowDialog();
+        void Close();
+    }
+}
diff --git a/src/ProjectEditor/editor/IView.cs b/src/ProjectEditor/editor/IView.cs
new file mode 100644
index 0000000..7433612
--- /dev/null
+++ b/src/ProjectEditor/editor/IView.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// 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.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// Common interface implemented by all views used in
+    /// the ProjectEditor application
+    /// </summary>
+    public interface IView
+    {
+        /// <summary>
+        /// Object that knows how to display various messages
+        /// in a MessageBox.
+        /// </summary>
+        IMessageDisplay MessageDisplay { get; }
+
+        /// <summary>
+        /// Gets or sets the visibility of the view
+        /// </summary>
+        bool Visible { get; set; }
+    }
+}
diff --git a/src/ProjectEditor/editor/Main/IMainView.cs b/src/ProjectEditor/editor/Main/IMainView.cs
new file mode 100644
index 0000000..f969c61
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/IMainView.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public delegate bool ActiveViewChangingHandler();
+    public delegate void ActiveViewChangedHandler();
+
+    /// <summary>
+    /// IMainView represents the top level view for the
+    /// Project editor. It provides a menu commands and several
+    /// utility methods used in opening and saving files. It
+    /// aggregates the property and xml views.
+    /// </summary>
+    public interface IMainView : IView
+    {
+        IDialogManager DialogManager { get; }
+
+        ICommand NewProjectCommand { get; }
+        ICommand OpenProjectCommand { get; }
+        ICommand CloseProjectCommand { get; }
+        ICommand SaveProjectCommand { get; }
+        ICommand SaveProjectAsCommand { get; }
+
+        event ActiveViewChangingHandler ActiveViewChanging;
+        event ActiveViewChangedHandler ActiveViewChanged;
+
+        event FormClosingEventHandler FormClosing;
+
+        IPropertyView PropertyView { get; }
+        IXmlView XmlView { get; }
+
+        SelectedView SelectedView { get; set;  }
+    }
+
+    public enum SelectedView
+    {
+        PropertyView = 0,
+        XmlView = 1
+    }
+}
diff --git a/src/ProjectEditor/editor/Main/IProjectDocument.cs b/src/ProjectEditor/editor/Main/IProjectDocument.cs
new file mode 100644
index 0000000..4fb556c
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/IProjectDocument.cs
@@ -0,0 +1,61 @@
+// ****************************************************************
+// 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.Xml;
+
+namespace NUnit.ProjectEditor
+{
+    public interface IProjectDocument
+    {
+        #region Events
+
+        event ActionDelegate ProjectCreated;
+        event ActionDelegate ProjectClosed;
+        event ActionDelegate ProjectChanged;
+
+        #endregion
+
+        #region Properties
+
+        string Name { get; }
+
+        /// <summary>
+        /// Gets or sets the path to which a doc will be saved.
+        /// </summary>
+        string ProjectPath { get; set; }
+
+        bool IsEmpty { get; }
+        bool IsValid { get; }
+
+        string XmlText { get; set; }
+        Exception Exception { get; }
+
+        XmlNode RootNode { get; }
+        XmlNode SettingsNode { get; }
+        XmlNodeList ConfigNodes { get; }
+
+        bool HasUnsavedChanges { get; }
+
+        string GetSettingsAttribute(string name);
+        void SetSettingsAttribute(string name, string value);
+        void RemoveSettingsAttribute(string name);
+
+        #endregion
+
+        #region Methods
+
+        void CreateNewProject();
+        void OpenProject(string fileName);
+        void CloseProject();
+        void SaveProject();
+        void SaveProject(string fileName);
+
+        void LoadXml(string xmlText);
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/Main/MainForm.Designer.cs b/src/ProjectEditor/editor/Main/MainForm.Designer.cs
new file mode 100644
index 0000000..58dd885
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/MainForm.Designer.cs
@@ -0,0 +1,290 @@
+namespace NUnit.ProjectEditor
+{
+    partial class MainForm
+    {
+        /// <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()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+            this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
+            this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+            this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.tabControl1 = new System.Windows.Forms.TabControl();
+            this.tabPage1 = new System.Windows.Forms.TabPage();
+            this.tabPage2 = new System.Windows.Forms.TabPage();
+            this.propertyView = new NUnit.ProjectEditor.PropertyView();
+            this.xmlView = new NUnit.ProjectEditor.XmlView();
+            this.menuStrip1.SuspendLayout();
+            this.tabControl1.SuspendLayout();
+            this.tabPage1.SuspendLayout();
+            this.tabPage2.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // menuStrip1
+            // 
+            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileToolStripMenuItem,
+            this.helpToolStripMenuItem});
+            this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+            this.menuStrip1.Name = "menuStrip1";
+            this.menuStrip1.Padding = new System.Windows.Forms.Padding(4, 2, 0, 2);
+            this.menuStrip1.Size = new System.Drawing.Size(594, 24);
+            this.menuStrip1.TabIndex = 0;
+            this.menuStrip1.Text = "menuStrip1";
+            // 
+            // fileToolStripMenuItem
+            // 
+            this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripMenuItem,
+            this.openToolStripMenuItem,
+            this.closeToolStripMenuItem,
+            this.toolStripSeparator,
+            this.saveToolStripMenuItem,
+            this.saveAsToolStripMenuItem,
+            this.toolStripSeparator1,
+            this.exitToolStripMenuItem});
+            this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+            this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+            this.fileToolStripMenuItem.Text = "&File";
+            // 
+            // newToolStripMenuItem
+            // 
+            this.newToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripMenuItem.Image")));
+            this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+            this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+            this.newToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.newToolStripMenuItem.Text = "&New";
+            // 
+            // openToolStripMenuItem
+            // 
+            this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image")));
+            this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+            this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+            this.openToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.openToolStripMenuItem.Text = "&Open";
+            // 
+            // closeToolStripMenuItem
+            // 
+            this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
+            this.closeToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.closeToolStripMenuItem.Text = "&Close";
+            // 
+            // toolStripSeparator
+            // 
+            this.toolStripSeparator.Name = "toolStripSeparator";
+            this.toolStripSeparator.Size = new System.Drawing.Size(143, 6);
+            // 
+            // saveToolStripMenuItem
+            // 
+            this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image")));
+            this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+            this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+            this.saveToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.saveToolStripMenuItem.Text = "&Save";
+            // 
+            // saveAsToolStripMenuItem
+            // 
+            this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+            this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.saveAsToolStripMenuItem.Text = "Save &As";
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(143, 6);
+            // 
+            // exitToolStripMenuItem
+            // 
+            this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+            this.exitToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.exitToolStripMenuItem.Text = "E&xit";
+            this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+            // 
+            // helpToolStripMenuItem
+            // 
+            this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.contentsToolStripMenuItem,
+            this.indexToolStripMenuItem,
+            this.searchToolStripMenuItem,
+            this.toolStripSeparator5,
+            this.aboutToolStripMenuItem});
+            this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+            this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+            this.helpToolStripMenuItem.Text = "&Help";
+            // 
+            // contentsToolStripMenuItem
+            // 
+            this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem";
+            this.contentsToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
+            this.contentsToolStripMenuItem.Text = "&Contents";
+            // 
+            // indexToolStripMenuItem
+            // 
+            this.indexToolStripMenuItem.Name = "indexToolStripMenuItem";
+            this.indexToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
+            this.indexToolStripMenuItem.Text = "&Index";
+            // 
+            // searchToolStripMenuItem
+            // 
+            this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
+            this.searchToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
+            this.searchToolStripMenuItem.Text = "&Search";
+            // 
+            // toolStripSeparator5
+            // 
+            this.toolStripSeparator5.Name = "toolStripSeparator5";
+            this.toolStripSeparator5.Size = new System.Drawing.Size(119, 6);
+            // 
+            // aboutToolStripMenuItem
+            // 
+            this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+            this.aboutToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
+            this.aboutToolStripMenuItem.Text = "&About...";
+            this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+            // 
+            // tabControl1
+            // 
+            this.tabControl1.Controls.Add(this.tabPage1);
+            this.tabControl1.Controls.Add(this.tabPage2);
+            this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tabControl1.Location = new System.Drawing.Point(0, 24);
+            this.tabControl1.Margin = new System.Windows.Forms.Padding(2);
+            this.tabControl1.Multiline = true;
+            this.tabControl1.Name = "tabControl1";
+            this.tabControl1.SelectedIndex = 0;
+            this.tabControl1.Size = new System.Drawing.Size(594, 434);
+            this.tabControl1.TabIndex = 1;
+            this.tabControl1.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl1_Selecting);
+            this.tabControl1.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControl1_Selected);
+            // 
+            // tabPage1
+            // 
+            this.tabPage1.BackColor = System.Drawing.Color.Gray;
+            this.tabPage1.Controls.Add(this.propertyView);
+            this.tabPage1.Location = new System.Drawing.Point(4, 22);
+            this.tabPage1.Margin = new System.Windows.Forms.Padding(2);
+            this.tabPage1.Name = "tabPage1";
+            this.tabPage1.Size = new System.Drawing.Size(586, 408);
+            this.tabPage1.TabIndex = 0;
+            this.tabPage1.Text = "Properties";
+            // 
+            // tabPage2
+            // 
+            this.tabPage2.BackColor = System.Drawing.Color.Gray;
+            this.tabPage2.Controls.Add(this.xmlView);
+            this.tabPage2.Location = new System.Drawing.Point(4, 22);
+            this.tabPage2.Margin = new System.Windows.Forms.Padding(2);
+            this.tabPage2.Name = "tabPage2";
+            this.tabPage2.Size = new System.Drawing.Size(586, 415);
+            this.tabPage2.TabIndex = 1;
+            this.tabPage2.Text = "XML View";
+            // 
+            // propertyView
+            // 
+            this.propertyView.BackColor = System.Drawing.SystemColors.Control;
+            this.propertyView.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.propertyView.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.propertyView.Location = new System.Drawing.Point(0, 0);
+            this.propertyView.Margin = new System.Windows.Forms.Padding(2);
+            this.propertyView.Name = "propertyView";
+            this.propertyView.Size = new System.Drawing.Size(586, 408);
+            this.propertyView.TabIndex = 0;
+            this.propertyView.Visible = false;
+            // 
+            // xmlView
+            // 
+            this.xmlView.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.xmlView.Location = new System.Drawing.Point(0, 0);
+            this.xmlView.Margin = new System.Windows.Forms.Padding(2);
+            this.xmlView.Name = "xmlView";
+            this.xmlView.Size = new System.Drawing.Size(586, 415);
+            this.xmlView.TabIndex = 0;
+            this.xmlView.Visible = false;
+            // 
+            // MainForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.SystemColors.Control;
+            this.ClientSize = new System.Drawing.Size(594, 458);
+            this.Controls.Add(this.tabControl1);
+            this.Controls.Add(this.menuStrip1);
+            this.MainMenuStrip = this.menuStrip1;
+            this.Margin = new System.Windows.Forms.Padding(2);
+            this.Name = "MainForm";
+            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+            this.Text = "NUnit Project Editor";
+            this.menuStrip1.ResumeLayout(false);
+            this.menuStrip1.PerformLayout();
+            this.tabControl1.ResumeLayout(false);
+            this.tabPage1.ResumeLayout(false);
+            this.tabPage2.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.MenuStrip menuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator;
+        private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+        private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem indexToolStripMenuItem;
+        private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem;
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
+        private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+        private System.Windows.Forms.TabControl tabControl1;
+        private System.Windows.Forms.TabPage tabPage1;
+        private System.Windows.Forms.TabPage tabPage2;
+        private XmlView xmlView;
+        private PropertyView propertyView;
+        private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;
+    }
+}
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/Main/MainForm.cs b/src/ProjectEditor/editor/Main/MainForm.cs
new file mode 100644
index 0000000..dc4a363
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/MainForm.cs
@@ -0,0 +1,146 @@
+// ****************************************************************
+// 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.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public delegate bool ViewClosingDelegate();
+
+    public partial class MainForm : Form, IMainView
+    {
+        #region Instance Variables
+
+        private IMessageDisplay messageDisplay;
+        private IDialogManager dialogManager;
+
+        private ICommand newProjectCommand;
+        private ICommand openProjectCommand;
+        private ICommand closeProjectCommand;
+        private ICommand saveProjectCommand;
+        private ICommand saveProjectAsCommand;
+
+        #endregion
+
+        #region Constructor
+
+        public MainForm()
+        {
+            InitializeComponent();
+
+            this.messageDisplay = new MessageDisplay("Nunit Project Editor");
+            this.dialogManager = new DialogManager("NUnit Project Editor");
+
+            this.newProjectCommand = new MenuElement(newToolStripMenuItem);
+            this.openProjectCommand = new MenuElement(openToolStripMenuItem);
+            this.closeProjectCommand = new MenuElement(closeToolStripMenuItem);
+            this.saveProjectCommand = new MenuElement(saveToolStripMenuItem);
+            this.saveProjectAsCommand = new MenuElement(saveAsToolStripMenuItem);
+        }
+
+        #endregion
+
+        #region IMainView Members
+
+        #region Events
+
+        public event ActiveViewChangingHandler ActiveViewChanging;
+        public event ActiveViewChangedHandler ActiveViewChanged;
+
+        #endregion
+
+        #region Properties
+
+        public IDialogManager DialogManager 
+        {
+            get { return dialogManager; }
+        }
+
+        public ICommand NewProjectCommand 
+        {
+            get { return newProjectCommand; }
+        }
+
+        public ICommand OpenProjectCommand 
+        { 
+            get {return openProjectCommand; }
+        }
+
+        public ICommand CloseProjectCommand 
+        {
+            get { return closeProjectCommand; }
+        }
+
+        public ICommand SaveProjectCommand 
+        {
+            get { return saveProjectCommand; }
+        }
+
+        public ICommand SaveProjectAsCommand 
+        {
+            get { return saveProjectAsCommand; }
+        }
+
+        public IXmlView XmlView
+        {
+            get { return xmlView; }
+        }
+
+        public IPropertyView PropertyView
+        {
+            get { return propertyView; }
+        }
+
+        public SelectedView SelectedView
+        {
+            get { return (SelectedView)tabControl1.SelectedIndex; }
+            set { tabControl1.SelectedIndex = (int)value; }
+        }
+
+        public IMessageDisplay MessageDisplay 
+        {
+            get { return messageDisplay; }
+        }
+
+        #endregion
+
+        #endregion
+
+        #region Event Handlers
+
+        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            this.Close();
+        }
+
+        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            AboutBox box = new AboutBox();
+            box.ShowDialog(this);
+        }
+
+        private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
+        {
+            if (ActiveViewChanging != null && !ActiveViewChanging())
+                e.Cancel = true;
+        }
+
+        private void tabControl1_Selected(object sender, TabControlEventArgs e)
+        {
+            if (ActiveViewChanged != null)
+                ActiveViewChanged();
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/Main/MainForm.resx b/src/ProjectEditor/editor/Main/MainForm.resx
new file mode 100644
index 0000000..d566032
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/MainForm.resx
@@ -0,0 +1,170 @@
+<?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>
+  <metadata name="menuStrip1.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="newToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEPSURBVDhPrdPZasJAFAZgX8q+Q32N9o2kXkjphQsigoJC
+        ixa1VAWXiohG7IakbmjcNcYl5i8TCQSdGXPhgcPczHwz5xzGZrtWRN+bOM1wqo5gvAJfrIBy4w/cu8hh
+        VjyG3nDjuOcjkbTABB58cSRy9SMiiPSXhF6rTMDpedEPG0ktJfD8wQT26gEEMSAq4I3mqYCmaZCVHQZj
+        WQfst3f0Ep7CGSqw3amYzBWI/TkfcAdTZ4B60LCQt+hJK3yJEz7g8ifOAGWzhzRdo9WdofYt8QFSnzlI
+        42bLDdqDBZqtMUpC3zpgbtxPe4rq5xDZSsc6YG6c8DtCodZDsihaA4x5s1bmGI0Zkw2X8lofWHf+AdjM
+        9sNc+xBlAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="openToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPlZNdSNNRGMb/F110ZZEVhVBgeeHNICiiuggp
+        olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdPKMgr7kApFItTUkWZqVhSVYmao5Nev/xyoQ4k88Nyc
+        8z6/93nP4QjCfy6lwc4ltZVso4P/tMyXRcmMHqZ0EeY6jZQVInzuf0e1Tb9Ina3P/tkpLD6XkNg8BJe5
+        u93C+HDVrP4M2ZkcMOOw5tLZ9nxJyJE4HSExBoKkBQhVpTrGhso9zNPfiph0JlB+U01ZcRbmwnRMeWlc
+        08opUCV6QissGsZ+WOY6z4hmuuXglC6pRYBbJSp+fzXNxnaZ66o1s3rkyKHWruJuWRYOcwZ2kxKr8TI3
+        DCkU6+QYNUnuNGWmLEY+5uOK3degoKZcx3SfEvozPfVB3OtNhi4ZvI2nrTIc23U9gtmYwa8eNXzScq8i
+        l6bHWnfRwhHeREJzGFONgYw/CeB9qQSZNNR9FyUGBT87lfQ3plJj1zLTq4COGDegLVo0HmeqKZjx+gOM
+        PNzDYPU2lLF+4jhyN6BIl8pgexK3bRpaXopJuhJEwGloiWDmVSgTLw4xWreXoZrtfK/wp/nKak4E+s6/
+        hDFHTkd9GndsOdCTBq1i3NdHmWgIYvRpAMO1OxlwSPhi2YpT641CuoWzsSfnAfnZiVRZ1Tjvx9GsF+bU
+        pF1BvWolD9JXUZmyDnOiD1cvbCZiYXfXCPrMi+gVZ8hOiiL53DHORwdzKnw/hw/uYt9uCTskfvj7+rBp
+        41rWr/Fig7fX8j/Tsn/fcgx/ARfG3ml6M3rzAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="saveToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIsSURBVDhPrZPdS5NxFMf3L3TfTdBFtzU1hmuxGjzlHMqq
+        YVgRvT2RL+XSZZqoWJlGLV8gW+HSScvpJJxU+AamSI2hTCVLM1e0xKGm2EQw+PY7v+j5tTIvoh+cy8/n
+        POec76NS/Y/37GkUVL72ZbR5l/DYvYDGhgjuO2ZQW/MJ9tsh3CifQmnJBAoLXiMvdxQXzgeh9Cawtweo
+        qV7FRm9ldQ3GtF4cTnvCSxF4Wxe5oLLiy195giMLK9htfg61WoblkEcI3I/muaC05PO6gp/w+/Ai4kw+
+        FFyexgFzkxA462e54JLt3R+CX+GRyQi2SV5Yc8aRmuIUgrq7YS7IzhqNEfwODwbD2Kx3Q5YDMJkcQlBd
+        9ZEL5DMBRbAe3OP/gE2JDThy9AWSkmqF4GblNLq7wE4JHD/5CpZjA3zbtDCamT6bOv+A+3DQ0glJsgvB
+        1bJJdPjAMgA0ub6xu39F+fU5vlRaGM2cmRFU4OTUdhgMFUJwpXAcnmbgoXONBScKY3pOTJlP2JB+roh3
+        Tk5h8H4P9PoyIbDljTEYqLoT5Z1JwEKCOK2EobezGJuag5x7DXuNbRzW7nFBpysSAoql4x6UzyYBwWfz
+        b+FNaB6hmSVcLLYjXu9icCPidz2ANjFfCDIzhtncy3zmrQYPtuyQ0NLRD1/XILr7/Bh4OYR9JgvUunok
+        MHi7pg4ajVUIKNOnT/XzeFLCKCR0ZzoVbZsWRjNTVyqCdyZkxwr+9a/+Dk60OMVjMFpXAAAAAElFTkSu
+        QmCC
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>25</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/Main/MainPresenter.cs b/src/ProjectEditor/editor/Main/MainPresenter.cs
new file mode 100644
index 0000000..cb20947
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/MainPresenter.cs
@@ -0,0 +1,210 @@
+// ****************************************************************
+// 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.Generic;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// MainPresenter is the top-level presenter with subordinate 
+    /// presenters for each view of the doc. It directly handles
+    /// the menu commands from the top-level view and coordinates 
+    /// changes in the two different submodels.
+    /// </summary>
+    public class MainPresenter
+    {
+        private IMainView view;
+        private IProjectDocument doc;
+
+        private PropertyPresenter propertyPresenter;
+        private XmlPresenter xmlPresenter;
+
+        #region Constructor
+
+        public MainPresenter(IProjectDocument doc, IMainView view)
+        {
+            this.doc = doc;
+            this.view = view;
+
+            // Set up property editor triad
+            ProjectModel project = new ProjectModel(doc);
+            IPropertyView propertyView = view.PropertyView;
+            this.propertyPresenter = new PropertyPresenter(project, propertyView);
+
+            // Set up XML editor triad
+            IXmlView xmlView = view.XmlView;
+            this.xmlPresenter = new XmlPresenter(doc, xmlView);
+
+            // Enable and disable menu items
+            view.NewProjectCommand.Enabled = true;
+            view.OpenProjectCommand.Enabled = true;
+            view.CloseProjectCommand.Enabled = false;
+            view.SaveProjectCommand.Enabled = false;
+            view.SaveProjectAsCommand.Enabled = false;
+
+            // Set up handlers for view events
+            view.FormClosing += OnFormClosing;
+
+            view.NewProjectCommand.Execute += CreateNewProject;
+            view.OpenProjectCommand.Execute += OpenProject;
+            view.SaveProjectCommand.Execute += SaveProject;
+            view.SaveProjectAsCommand.Execute += SaveProjectAs;
+            view.CloseProjectCommand.Execute += CloseProject;
+            view.ActiveViewChanging += this.ValidateActiveViewChange;
+            view.ActiveViewChanged += this.ActiveViewChanged;
+
+            // Set up handlers for model events
+            doc.ProjectCreated += OnProjectCreated;
+            doc.ProjectClosed += OnProjectClosed;
+        }
+
+        public void OnFormClosing(object sender, FormClosingEventArgs e)
+        {
+            CloseProject();
+        }
+
+        public bool ValidateActiveViewChange()
+        {
+            if (doc.IsValid || doc.IsEmpty)
+                return true;
+
+            view.SaveProjectCommand.Enabled = false;
+            view.SaveProjectAsCommand.Enabled = false;
+
+            return view.SelectedView == SelectedView.XmlView;
+        }
+
+        public void ActiveViewChanged()
+        {
+            switch (view.SelectedView)
+            {
+                case SelectedView.PropertyView:
+                    if (doc.RootNode != null)
+                        propertyPresenter.LoadViewFromModel();
+                    break;
+
+                case SelectedView.XmlView:
+                    xmlPresenter.LoadViewFromModel();
+                    break;
+            }
+        }
+
+        #endregion
+
+        #region Command Event Handlers
+
+        private void CreateNewProject()
+        {
+            doc.CreateNewProject();
+        }
+
+        private void OpenProject()
+        {
+            string path = view.DialogManager.GetFileOpenPath(
+                "Open Project", 
+                "Test Projects (*.nunit)|*.nunit",
+                null);
+
+            if (path != null)
+            {
+                try
+                {
+                    doc.OpenProject(path);
+                }
+                catch (Exception ex)
+                {
+                    view.MessageDisplay.Error(ex.Message);
+                }
+            }
+        }
+
+        private void CloseProject()
+        {
+            if (doc.IsValid && doc.HasUnsavedChanges &&
+                view.MessageDisplay.AskYesNoQuestion(string.Format("Do you want to save changes to {0}?", doc.Name)))
+                    SaveProject();
+
+            doc.CloseProject();
+        }
+
+        private void SaveProject()
+        {
+            if (IsValidWritableProjectPath(doc.ProjectPath))
+            {
+                doc.SaveProject();
+            }
+            else
+            {
+                this.SaveProjectAs();
+            }
+        }
+
+        private void SaveProjectAs()
+        {
+            string path = view.DialogManager.GetSaveAsPath(
+                "Save As",
+                "Test Projects (*.nunit)|*.nunit");
+
+            if (path != null)
+            {
+                doc.SaveProject(path);
+                view.PropertyView.ProjectPath.Text = doc.ProjectPath;
+            }
+        }
+
+        #endregion
+
+        #region Model EventHandlers
+
+        private void OnProjectCreated()
+        {
+            view.CloseProjectCommand.Enabled = true;
+
+            if (doc.IsValid)
+            {
+                view.SaveProjectCommand.Enabled = true;
+                view.SaveProjectAsCommand.Enabled = true;
+            }
+            else
+            {
+                view.SaveProjectCommand.Enabled = false;
+                view.SaveProjectAsCommand.Enabled = false;
+                view.SelectedView = SelectedView.XmlView;
+            }
+        }
+
+        private void OnProjectClosed()
+        {
+            view.CloseProjectCommand.Enabled = false;
+            view.SaveProjectCommand.Enabled = false;
+            view.SaveProjectAsCommand.Enabled = false;
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private static bool IsValidWritableProjectPath(string path)
+        {
+            if (!Path.IsPathRooted(path))
+                return false;
+
+            if (!ProjectDocument.IsProjectFile(path))
+                return false;
+
+            if (!File.Exists(path))
+                return true;
+
+            return (File.GetAttributes(path) & FileAttributes.ReadOnly) == 0;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/Main/ProjectDocument.cs b/src/ProjectEditor/editor/Main/ProjectDocument.cs
new file mode 100644
index 0000000..1832644
--- /dev/null
+++ b/src/ProjectEditor/editor/Main/ProjectDocument.cs
@@ -0,0 +1,373 @@
+// ****************************************************************
+// 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.Generic;
+using System.IO;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+    public class ProjectDocument : IProjectDocument
+    {
+        private enum DocumentState
+        {
+            Empty,
+            InvalidXml,
+            Valid
+        }
+
+        #region Static Fields
+
+        /// <summary>
+        /// Used to generate default names for projects
+        /// </summary>
+        private static int projectSeed = 0;
+
+        /// <summary>
+        /// The extension used for test projects
+        /// </summary>
+        private static readonly string nunitExtension = ".nunit";
+
+        #endregion
+
+        #region Instance Fields
+
+        /// <summary>
+        /// The original text from which the doc was loaded.
+        /// Updated from the doc when the xml view is displayed
+        /// and from the view when the user edits it.
+        /// </summary>
+        string xmlText;
+
+        /// <summary>
+        /// The XmlDocument representing the loaded doc. It
+        /// is generated from the text when the doc is loaded
+        /// unless an exception is thrown. It is modified as the
+        /// user makes changes.
+        /// </summary>
+        XmlDocument xmlDoc;
+
+        /// <summary>
+        /// An exception thrown when trying to build the xml
+        /// document from the xml text.
+        /// </summary>
+        Exception exception;
+
+        /// <summary>
+        /// Path to the file storing this doc
+        /// </summary>
+        private string projectPath;
+
+        /// <summry>
+        /// True if the Xml Document has been changed
+        /// </summary>
+        private DocumentState documentState = DocumentState.Empty;
+
+        /// <summary>
+        /// True if the doc has been changed and not yet saved
+        /// </summary>
+        private bool hasUnsavedChanges = false;
+
+        #endregion
+
+        #region Constructors
+
+        public ProjectDocument() : this(GenerateProjectName()) { }
+
+        public ProjectDocument(string projectPath)
+        {
+            this.xmlDoc = new XmlDocument();
+            this.projectPath = Path.GetFullPath(projectPath);
+
+            xmlDoc.NodeChanged += new XmlNodeChangedEventHandler(xmlDoc_Changed);
+            xmlDoc.NodeInserted += new XmlNodeChangedEventHandler(xmlDoc_Changed);
+            xmlDoc.NodeRemoved += new XmlNodeChangedEventHandler(xmlDoc_Changed);
+        }
+
+        #endregion
+
+        #region IProjectDocument Members
+
+        #region Events
+
+        public event ActionDelegate ProjectCreated;
+        public event ActionDelegate ProjectClosed;
+        public event ActionDelegate ProjectChanged;
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// The name of the doc.
+        /// </summary>
+        public string Name
+        {
+            get { return Path.GetFileNameWithoutExtension(projectPath); }
+        }
+
+        /// <summary>
+        /// Gets or sets the path to which a doc will be saved.
+        /// </summary>
+        public string ProjectPath
+        {
+            get { return projectPath; }
+            set
+            {
+                string newProjectPath = Path.GetFullPath(value);
+                if (newProjectPath != projectPath)
+                {
+                    projectPath = newProjectPath;
+                }
+            }
+        }
+
+        public string XmlText
+        {
+            get { return xmlText; }
+            set { LoadXml(value); }
+        }
+
+        public Exception Exception
+        {
+            get { return exception; }
+        }
+
+        /// <summary>
+        /// The top-level (NUnitProject) node
+        /// </summary>
+        public XmlNode RootNode
+        {
+            get { return xmlDoc.FirstChild; }
+        }
+
+        /// <summary>
+        /// The Settings node if present, otherwise null
+        /// </summary>
+        public XmlNode SettingsNode
+        {
+            get { return RootNode.SelectSingleNode("Settings"); }
+        }
+
+        /// <summary>
+        /// The collection of Config nodes - may be empty
+        /// </summary>
+        public XmlNodeList ConfigNodes
+        {
+            get { return RootNode.SelectNodes("Config"); }
+        }
+
+        public bool HasUnsavedChanges
+        {
+            get { return hasUnsavedChanges; }
+        }
+
+        public bool IsValid
+        {
+            get { return documentState == DocumentState.Valid; }
+        }
+
+        public bool IsEmpty
+        {
+            get { return documentState == DocumentState.Empty; }
+        }
+
+        #endregion
+
+        #region Methods
+
+        public void CreateNewProject()
+        {
+            this.XmlText = "<NUnitProject />";
+
+            hasUnsavedChanges = false;
+
+            if (ProjectCreated != null)
+                ProjectCreated();
+        }
+
+        public void OpenProject(string fileName)
+        {
+            StreamReader rdr = new StreamReader(fileName);
+            this.XmlText = rdr.ReadToEnd();
+            rdr.Close();
+
+            this.projectPath = Path.GetFullPath(fileName);
+
+            if (ProjectCreated != null)
+                ProjectCreated();
+
+            hasUnsavedChanges = false;
+        }
+
+        public void CloseProject()
+        {
+            if (ProjectClosed != null)
+                ProjectClosed();
+        }
+
+        public void SaveProject()
+        {
+            XmlTextWriter writer = new XmlTextWriter(
+                ProjectPathFromFile(projectPath),
+                System.Text.Encoding.UTF8);
+            writer.Formatting = Formatting.Indented;
+
+            xmlDoc.WriteTo(writer);
+            writer.Close();
+
+            hasUnsavedChanges = false;
+        }
+
+        public void SaveProject(string fileName)
+        {
+            projectPath = fileName;
+            SaveProject();
+        }
+
+        public string GetSettingsAttribute(string name)
+        {
+            if (SettingsNode == null)
+                return null;
+
+            return XmlHelper.GetAttribute(SettingsNode, name);
+        }
+
+        public void SetSettingsAttribute(string name, string value)
+        {
+            if (value == null)
+                RemoveSettingsAttribute(name);
+            else
+            {
+                if (SettingsNode == null)
+                    XmlHelper.InsertElement(RootNode, "Settings", 0);
+
+                XmlHelper.SetAttribute(SettingsNode, name, value);
+            }
+        }
+
+        public void RemoveSettingsAttribute(string name)
+        {
+            if (SettingsNode != null)
+                XmlHelper.RemoveAttribute(SettingsNode, name);
+        }
+
+        #region Load Methods
+
+        public void Load()
+        {
+            StreamReader rdr = new StreamReader(this.projectPath);
+            this.XmlText = rdr.ReadToEnd();
+            rdr.Close();
+
+            this.hasUnsavedChanges = false;
+        }
+
+        public void LoadXml(string xmlText)
+        {
+            // Mark as empty to avoid double updates
+            // in the xmldoc_Changed method.
+            this.documentState = DocumentState.Empty;
+
+            this.xmlText = xmlText;
+
+            try
+            {
+                this.xmlDoc.LoadXml(xmlText);
+                this.documentState = DocumentState.Valid;
+                this.exception = null;
+
+                if (RootNode.Name != "NUnitProject")
+                    throw new XmlException("Top level element must be <NUnitProject...>.");
+            }
+            catch (Exception ex)
+            {
+                this.documentState = DocumentState.InvalidXml;
+                this.exception = ex;
+            }
+        }
+
+        #endregion
+
+        #region Save methods
+
+        public void Save()
+        {
+            using (StreamWriter writer = new StreamWriter(ProjectPathFromFile(projectPath), false, System.Text.Encoding.UTF8))
+            {
+                writer.Write(xmlText);
+            }
+
+            hasUnsavedChanges = false;
+        }
+
+        public void Save(string fileName)
+        {
+            this.projectPath = Path.GetFullPath(fileName);
+            Save();
+        }
+
+        private string ToXml()
+        {
+            StringWriter buffer = new StringWriter();
+
+            using (XmlTextWriter writer = new XmlTextWriter(buffer))
+            {
+                writer.Formatting = Formatting.Indented;
+                xmlDoc.WriteTo(writer);
+            }
+
+            return buffer.ToString();
+        }
+
+        #endregion
+
+        #endregion
+
+        #endregion
+
+        #region Event Handlers
+
+        void xmlDoc_Changed(object sender, XmlNodeChangedEventArgs e)
+        {
+            hasUnsavedChanges = true;
+
+            if (this.IsValid)
+                xmlText = this.ToXml();
+
+            if (this.ProjectChanged != null)
+                ProjectChanged();
+        }
+
+        #endregion
+
+        #region Private Properties and Helper Methods
+
+        private string DefaultBasePath
+        {
+            get { return Path.GetDirectoryName(projectPath); }
+        }
+
+        public static bool IsProjectFile(string path)
+        {
+            return Path.GetExtension(path) == nunitExtension;
+        }
+
+        private static string ProjectPathFromFile(string path)
+        {
+            string fileName = Path.GetFileNameWithoutExtension(path) + nunitExtension;
+            return Path.Combine(Path.GetDirectoryName(path), fileName);
+        }
+
+        private static string GenerateProjectName()
+        {
+            return string.Format("Project{0}", ++projectSeed);
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PathUtils.cs b/src/ProjectEditor/editor/PathUtils.cs
new file mode 100644
index 0000000..6b8d0b8
--- /dev/null
+++ b/src/ProjectEditor/editor/PathUtils.cs
@@ -0,0 +1,256 @@
+// ****************************************************************
+// 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.IO;
+using System.Text;
+using System.Reflection;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// Static methods for manipulating doc paths, including both directories
+	/// and files. Some synonyms for System.Path methods are included as well.
+	/// </summary> 
+	public class PathUtils
+	{
+		public const uint FILE_ATTRIBUTE_DIRECTORY  = 0x00000010;  
+		public const uint FILE_ATTRIBUTE_NORMAL     = 0x00000080;  
+		public const int MAX_PATH = 256;
+
+		protected static char DirectorySeparatorChar = Path.DirectorySeparatorChar;
+		protected static char AltDirectorySeparatorChar = Path.AltDirectorySeparatorChar;
+
+		#region Public methods
+
+		public static bool IsAssemblyFileType( string path )
+		{
+			string extension = Path.GetExtension( path ).ToLower();
+			return extension == ".dll" || extension == ".exe";
+		}
+
+		/// <summary>
+		/// Returns the relative path from a base directory to another
+		/// directory or file.
+		/// </summary>
+		public static string RelativePath( string from, string to )
+		{
+			if (from == null)
+				throw new ArgumentNullException (from);
+			if (to == null)
+				throw new ArgumentNullException (to);
+
+            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 (!PathsEqual(_from[last_common], _to[last_common]))
+                    break;
+            }
+
+			if (last_common < _from.Length)
+				sb.Append ("..");
+			for (int i = last_common + 1; i < _from.Length; ++i) 
+			{
+				sb.Append (PathUtils.DirectorySeparatorChar).Append ("..");
+			}
+
+			if (sb.Length > 0)
+				sb.Append (PathUtils.DirectorySeparatorChar);
+			if (last_common < _to.Length)
+				sb.Append (_to [last_common]);
+			for (int i = last_common + 1; i < _to.Length; ++i) 
+			{
+				sb.Append (PathUtils.DirectorySeparatorChar).Append (_to [i]);
+			}
+
+			return sb.ToString ();
+		}
+
+		/// <summary>
+		/// Return the canonical form of a path.
+		/// </summary>
+		public static string Canonicalize( string path )
+		{
+			List<string> parts = new List<string>(
+				path.Split( DirectorySeparatorChar, AltDirectorySeparatorChar ) );
+
+			for( int index = 0; index < parts.Count; )
+			{
+				string part = parts[index];
+		
+				switch( part )
+				{
+					case ".":
+						parts.RemoveAt( index );
+						break;
+				
+					case "..":
+						parts.RemoveAt( index );
+						if ( index > 0 )
+							parts.RemoveAt( --index );
+						break;
+					default:
+						index++;
+						break;
+				}
+			}
+	
+			return String.Join( DirectorySeparatorChar.ToString(), parts.ToArray() );
+		}
+
+		/// <summary>
+		/// True if the two paths are the same. However, two paths
+		/// to the same file or directory using different network
+		/// shares or drive letters are not treated as equal.
+		/// </summary>
+		public static bool SamePath( string path1, string path2 )
+		{
+			return string.Compare( Canonicalize(path1), Canonicalize(path2), PathUtils.IsWindows() ) == 0;
+		}
+
+		/// <summary>
+		/// True if the two paths are the same or if the second is
+		/// directly or indirectly under the first. Note that paths 
+		/// using different network shares or drive letters are 
+		/// considered unrelated, even if they end up referencing
+		/// the same subtrees in the file system.
+		/// </summary>
+		public static bool SamePathOrUnder( string path1, string path2 )
+		{
+			path1 = Canonicalize( path1 );
+			path2 = Canonicalize( 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, IsWindows() ) == 0;
+
+			// path 2 is longer than path 1: see if initial parts match
+			if ( string.Compare( path1, path2.Substring( 0, length1 ), IsWindows() ) != 0 )
+				return false;
+			
+			// must match through or up to a directory separator boundary
+			return	path2[length1-1] == DirectorySeparatorChar ||
+				path2[length1] == DirectorySeparatorChar;
+		}
+
+		public static string Combine( string path1, params string[] morePaths )
+		{
+			string result = path1;
+			foreach( string path in morePaths )
+				result = Path.Combine( result, path );
+			return result;
+		}
+
+		// TODO: This logic should be in shared source
+		public static string GetAssemblyPath( Assembly assembly )
+		{
+			string uri = assembly.CodeBase;
+
+			// If it wasn't loaded locally, use the Location
+			if ( !uri.StartsWith( Uri.UriSchemeFile ) )
+				return assembly.Location;
+
+			return GetAssemblyPathFromFileUri( uri );
+		}
+
+		// Separate method for testability
+		public static string GetAssemblyPathFromFileUri( string uri )
+		{
+			// Skip over the file://
+			int start = Uri.UriSchemeFile.Length + Uri.SchemeDelimiter.Length;
+			
+			if ( PathUtils.DirectorySeparatorChar == '\\' )
+			{
+				if ( uri[start] == '/' && uri[start+2] == ':' )
+					++start;
+			}
+			else
+			{
+				if ( uri[start] != '/' )
+					--start;
+			}
+
+			return uri.Substring( start );
+		}
+		#endregion
+
+		#region Helper Methods
+
+		private static bool IsWindows()
+		{
+			return PathUtils.DirectorySeparatorChar == '\\';
+		}
+
+        private static string[] SplitPath(string path)
+        {
+            char[] separators = new char[] { PathUtils.DirectorySeparatorChar, PathUtils.AltDirectorySeparatorChar };
+
+#if CLR_2_0 || CLR_4_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 CLR_2_0 || CLR_4_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/ProjectEditor/editor/Program.cs b/src/ProjectEditor/editor/Program.cs
new file mode 100644
index 0000000..4384247
--- /dev/null
+++ b/src/ProjectEditor/editor/Program.cs
@@ -0,0 +1,63 @@
+// ****************************************************************
+// 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.Generic;
+using System.Windows.Forms;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+    static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main(string[] args)
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+
+#if DEBUG
+            //MessageBox.Show("Attach to editor if desired", "Debug ProjectEditor?");
+#endif
+
+            // Set up main editor triad
+            ProjectDocument doc = new ProjectDocument();
+            MainForm view = new MainForm();
+            MainPresenter presenter = new MainPresenter(doc, view);
+
+            // TODO: Process arguments
+            //    -new          = create new project
+            //    -config=name  = create a new config (implies -new)
+            //    assemblyName  = add assembly to the last config specified (or Default)
+
+            if (args.Length == 1 && ProjectDocument.IsProjectFile(args[0]))
+                doc.OpenProject(args[0]);
+            else if (args.Length > 0)
+            {
+                doc.CreateNewProject();
+                XmlNode configNode = XmlHelper.AddElement(doc.RootNode, "Config");
+                XmlHelper.AddAttribute(configNode, "name", "Default");
+
+                foreach (string fileName in args)
+                {
+                    if (PathUtils.IsAssemblyFileType(fileName))
+                    {
+                        XmlNode assemblyNode = XmlHelper.AddElement(configNode, "assembly");
+                        XmlHelper.AddAttribute(assemblyNode, "path", fileName);
+                    }
+                }
+
+                // Simulate view change so view gets updated
+                presenter.ActiveViewChanged();
+            }
+
+            Application.Run(view);
+        }
+    }
+}
diff --git a/src/ProjectEditor/editor/Properties/AssemblyInfo.cs b/src/ProjectEditor/editor/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..4c1ae7f
--- /dev/null
+++ b/src/ProjectEditor/editor/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("NUnit Project Editor")]
+[assembly: AssemblyDescription("Standalone NUnit project editor")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("NUnit Software")]
+[assembly: AssemblyProduct("NUnit Project Editor")]
+[assembly: AssemblyCopyright("Copyright ©  2011 Charlie Poole")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this doc is exposed to COM
+[assembly: Guid("d04fe5e3-ffa5-4510-a7c4-c2edd4dff058")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.9.0.0")]
+[assembly: AssemblyFileVersion("0.9.0.0")]
diff --git a/src/ProjectEditor/editor/PropertyEditor/AssemblyList.cs b/src/ProjectEditor/editor/PropertyEditor/AssemblyList.cs
new file mode 100644
index 0000000..23373de
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/AssemblyList.cs
@@ -0,0 +1,95 @@
+// ****************************************************************
+// 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.Generic;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// Represents a list of assemblies. It stores paths 
+	/// that are added and fires an event whenevever it
+	/// changes. All paths should be added as absolute paths.
+	/// </summary>
+	public class AssemblyList
+	{
+        private XmlNode configNode;
+
+        public AssemblyList(XmlNode configNode)
+        {
+            this.configNode = configNode;
+        }
+
+        #region Properties
+
+        public string this[int index]
+        {
+            get { return XmlHelper.GetAttribute(AssemblyNodes[index], "path"); }
+            set { XmlHelper.SetAttribute(AssemblyNodes[index], "path", value); }
+        }
+
+        public int Count
+        {
+            get { return AssemblyNodes.Count; }
+        }
+
+        #endregion
+
+        #region Methods
+
+        public void Add(string assemblyPath)
+        {
+            XmlHelper.AddAttribute(
+                XmlHelper.AddElement(configNode, "assembly"),
+                "path",
+                assemblyPath);
+        }
+
+        public void Insert(int index, string assemblyPath)
+        {
+            XmlHelper.AddAttribute(
+                XmlHelper.InsertElement(configNode, "assembly", index),
+                "path",
+                assemblyPath);
+        }
+
+        public void Remove(string assemblyPath)
+        {
+            foreach (XmlNode node in configNode.SelectNodes("assembly"))
+            {
+                string path = XmlHelper.GetAttribute(node, "path");
+                if (path == assemblyPath)
+                {
+                    configNode.RemoveChild(node);
+                    break;
+                }
+            }
+        }
+
+        public IEnumerator<string> GetEnumerator()
+        {
+            foreach (XmlNode node in AssemblyNodes)
+                yield return XmlHelper.GetAttribute(node, "path");
+        }
+
+        #endregion
+
+        #region private Properties
+
+        private XmlNodeList AssemblyNodes
+        {
+            get { return configNode.SelectNodes("assembly"); }
+        }
+
+        private XmlNode GetAssemblyNodes(int index)
+        {
+            return AssemblyNodes[index];
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/ConfigList.cs b/src/ProjectEditor/editor/PropertyEditor/ConfigList.cs
new file mode 100644
index 0000000..a7862d2
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/ConfigList.cs
@@ -0,0 +1,124 @@
+// ****************************************************************
+// 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.Generic;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// Summary description for ConfigList.
+	/// </summary>
+	public class ConfigList : IEnumerable<IProjectConfig>
+	{
+        private IProjectModel project;
+        private XmlNode projectNode;
+
+        public ConfigList(IProjectModel project)
+        {
+            this.project = project;
+            this.projectNode = project.Document.RootNode;
+        }
+
+		#region Properties
+
+        public int Count
+        {
+            get { return ConfigNodes.Count; }
+        }
+
+		public IProjectConfig this[int index]
+		{
+            get { return new ProjectConfig(project, ConfigNodes[index]); }
+		}
+
+        public IProjectConfig this[string name]
+        {
+            get
+            {
+                int index = IndexOf(name);
+                return index >= 0 ? this[index] : null;
+            }
+        }
+
+        private XmlNodeList ConfigNodes
+        {
+            get { return projectNode.SelectNodes("Config"); }
+        }
+
+        private XmlNode SettingsNode
+        {
+            get { return projectNode.SelectSingleNode("Settings"); }
+        }
+
+		#endregion
+
+		#region Methods
+
+        //public IProjectConfig Add(string name)
+        //{
+        //    XmlNode configNode = XmlHelper.AddElement(projectNode, "Config");
+        //    XmlHelper.AddAttribute(configNode, "name", name);
+
+        //    return new ProjectConfig(project, configNode);
+        //}
+
+        //public void RemoveAt(int index)
+        //{
+        //    bool wasActive = project.ActiveConfigName == this[index].Name;
+        //    projectNode.RemoveChild(ConfigNodes[index]);
+        //    if (wasActive)
+        //        project.ActiveConfigName = null;
+        //}
+
+        //public void Remove(string name)
+        //{
+        //    int index = IndexOf(name);
+        //    if (index >= 0)
+        //    {
+        //        RemoveAt(index);
+        //    }
+        //}
+
+        private int IndexOf(string name)
+        {
+            for (int index = 0; index < ConfigNodes.Count; index++)
+            {
+                if (XmlHelper.GetAttribute(ConfigNodes[index], "name") == name)
+                    return index;
+            }
+
+            return -1;
+        }
+
+        //public bool Contains(string name)
+        //{
+        //    return IndexOf(name) >= 0;
+        //}
+
+		#endregion
+
+        #region IEnumerable<IProjectConfig> Members
+
+        public IEnumerator<IProjectConfig> GetEnumerator()
+        {
+            foreach (XmlNode node in ConfigNodes)
+                yield return new ProjectConfig(project, node);
+        }
+
+        #endregion
+
+        #region IEnumerable Members
+
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            return this.GetEnumerator();
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/IProjectConfig.cs b/src/ProjectEditor/editor/PropertyEditor/IProjectConfig.cs
new file mode 100644
index 0000000..16bfbbd
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/IProjectConfig.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor
+{
+    public interface IProjectConfig
+    {
+        string Name { get; set; }
+
+        string BasePath { get; set; }
+
+        string RelativeBasePath { get; }
+
+        string EffectiveBasePath { get; }
+
+        string ConfigurationFile { get; set; }
+
+        string PrivateBinPath { get; set; }
+
+        BinPathType BinPathType { get; set; }
+
+        AssemblyList Assemblies { get; }
+
+        RuntimeFramework RuntimeFramework { get; set; }
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/IProjectModel.cs b/src/ProjectEditor/editor/PropertyEditor/IProjectModel.cs
new file mode 100644
index 0000000..652a743
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/IProjectModel.cs
@@ -0,0 +1,39 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor
+{
+    public interface IProjectModel
+    {
+        #region Properties
+
+        IProjectDocument Document { get; }
+
+        string ProjectPath { get; set; }
+        string BasePath { get; set; }
+        string EffectiveBasePath { get; }
+
+        string ActiveConfigName { get; set; }
+
+        string ProcessModel { get; set; }
+        string DomainUsage { get; set; }
+
+        ConfigList Configs { get; }
+        string[] ConfigNames { get; }
+
+        #endregion
+
+        #region Methods
+
+        IProjectConfig AddConfig(string name);
+        void RemoveConfig(string name);
+        void RemoveConfigAt(int index);
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/IPropertyView.cs b/src/ProjectEditor/editor/PropertyEditor/IPropertyView.cs
new file mode 100644
index 0000000..75a64a9
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/IPropertyView.cs
@@ -0,0 +1,61 @@
+// ****************************************************************
+// 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.Generic;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public interface IPropertyView : IView
+    {
+        #region Properties
+
+        IDialogManager DialogManager { get; }
+        IConfigurationEditorDialog ConfigurationEditorDialog { get; }
+
+        #region Command Elements
+
+        ICommand BrowseProjectBaseCommand { get; }
+        ICommand EditConfigsCommand { get; }
+        ICommand BrowseConfigBaseCommand { get; }
+
+        ICommand AddAssemblyCommand { get; }
+        ICommand RemoveAssemblyCommand { get; }
+        ICommand BrowseAssemblyPathCommand { get; }
+
+        #endregion
+
+        #region Properties of the Model as a Whole
+
+        ITextElement ProjectPath { get; }
+        ITextElement ProjectBase { get; }
+        ISelectionList ProcessModel { get; }
+        ISelectionList DomainUsage { get; }
+        ITextElement ActiveConfigName { get; }
+
+        ISelectionList ConfigList { get; }
+
+        #endregion
+
+        #region Properties of the Selected Config
+
+        ISelectionList Runtime { get; }
+        IComboBox RuntimeVersion { get; }
+        ITextElement ApplicationBase { get; }
+        ITextElement ConfigurationFile { get; }
+
+        ISelection BinPathType { get; }
+        ITextElement PrivateBinPath { get; }
+
+        ISelectionList AssemblyList { get; }
+        ITextElement AssemblyPath { get; }
+
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/ProjectConfig.cs b/src/ProjectEditor/editor/PropertyEditor/ProjectConfig.cs
new file mode 100644
index 0000000..32b7c4f
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/ProjectConfig.cs
@@ -0,0 +1,185 @@
+// ****************************************************************
+// 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.Generic;
+using System.IO;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+	public enum BinPathType
+	{
+		Auto,
+		Manual,
+		None
+	}
+
+	public class ProjectConfig : IProjectConfig
+	{
+		#region Instance Variables
+
+        /// <summary>
+        /// The XmlNode representing this config
+        /// </summary>
+        private XmlNode configNode;
+        
+		/// <summary>
+		/// IProject interface of containing doc
+		/// </summary>
+		private IProjectModel project;
+
+        /// <summary>
+        /// List of the test assemblies in this config
+        /// </summary>
+        private AssemblyList assemblies;
+
+		#endregion
+
+		#region Constructor
+
+        public ProjectConfig(IProjectModel project, XmlNode configNode)
+        {
+            this.project = project;
+            this.configNode = configNode;
+            this.assemblies = new AssemblyList(configNode);
+        }
+
+		#endregion
+
+		#region Properties
+
+        public string Name
+        {
+            get { return GetAttribute("name"); }
+            set 
+            {
+                bool itWasActive = Name == project.ActiveConfigName;
+
+                SetAttribute("name", value);
+
+                if (itWasActive)
+                    project.ActiveConfigName = value;
+            }
+        }
+
+        /// <summary>
+        /// The base directory for this config as stored
+        /// in the config element ofthe document. May be null.
+        /// </summary>
+        public string BasePath
+        {
+            get { return GetAttribute("appbase"); }
+            set { SetAttribute("appbase", value); }
+        }
+
+        /// <summary>
+        /// The base path relative to the doc base. This is what
+        /// is stored in the document unless the user edits the
+        /// xml directly.
+        /// </summary>
+        public string RelativeBasePath
+        {
+            get
+            {
+                return PathUtils.RelativePath(project.EffectiveBasePath, EffectiveBasePath);
+            }
+        }
+
+        /// <summary>
+        /// The actual base path used in loading the tests. Its
+        /// value depends on the appbase entry of the config element
+        /// as well as the project EffectiveBasePath.
+        /// </summary>
+        public string EffectiveBasePath
+        {
+            get
+            {
+                string basePath = BasePath;
+
+                if (project == null) 
+                    return basePath;
+
+                if (basePath == null)
+                    return project.EffectiveBasePath;
+
+                return Path.Combine(project.EffectiveBasePath, basePath);
+            }
+        }
+
+        public string ConfigurationFile
+        {
+            get { return GetAttribute("configfile"); }
+            set { SetAttribute("configfile", value); }
+        }
+
+        /// <summary>
+        /// The Path.PathSeparator-separated path containing all the
+        /// assemblies in the list. May be null if not specified.
+        /// </summary>
+        public string PrivateBinPath
+        {
+            get { return GetAttribute("binpath"); }
+            set { SetAttribute("binpath", value); }
+        }
+
+        /// <summary>
+        /// How our PrivateBinPath is generated
+        /// </summary>
+        public BinPathType BinPathType
+        {
+            get 
+            { 
+                return XmlHelper.GetAttributeAsEnum(
+                    configNode, 
+                    "binpathtype", 
+                    PrivateBinPath == null
+                        ? BinPathType.Auto
+                        : BinPathType.Manual);
+            }
+            set { SetAttribute("binpathtype", value); }
+        }
+
+        /// <summary>
+        /// Return our AssemblyList
+        /// </summary>
+        public AssemblyList Assemblies
+        {
+            get { return assemblies; }
+        }
+
+        public RuntimeFramework RuntimeFramework
+        {
+            get 
+            {
+                string runtime = GetAttribute("runtimeFramework");
+                return runtime == null 
+                    ? RuntimeFramework.AnyRuntime 
+                    : new RuntimeFramework(runtime);
+            }
+            set { SetAttribute("runtimeFramework", value); }
+        }
+
+		#endregion
+
+        #region Helper Methods
+
+        private string GetAttribute(string name)
+        {
+            return XmlHelper.GetAttribute(configNode, name);
+        }
+
+        private void SetAttribute(string name, object value)
+        {
+            if (value == null)
+                XmlHelper.RemoveAttribute(configNode, name);
+            else
+                XmlHelper.SetAttribute(configNode, name, value);
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/ProjectModel.cs b/src/ProjectEditor/editor/PropertyEditor/ProjectModel.cs
new file mode 100644
index 0000000..25e62fe
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/ProjectModel.cs
@@ -0,0 +1,140 @@
+// ****************************************************************
+// 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.IO;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+    public class ProjectModel : IProjectModel
+    {
+        private IProjectDocument doc;
+
+        public ProjectModel(IProjectDocument doc)
+        {
+            this.doc = doc;
+        }
+
+        #region IProjectModel Members
+
+        public IProjectDocument Document
+        {
+            get { return doc; }
+        }
+
+        public string ProjectPath
+        {
+            get { return doc.ProjectPath; }
+            set { doc.ProjectPath = value; }
+        }
+
+        /// <summary>
+        /// BasePath is the base as it appears in the document
+        /// and may be null if there is no setting.
+        /// </summary>
+        public string BasePath
+        {
+            get { return doc.GetSettingsAttribute("appbase"); }
+            set { doc.SetSettingsAttribute("appbase", value); }
+        }
+
+        /// <summary>
+        /// EffectiveBasePath uses the BasePath if present and otherwise
+        /// defaults to the directory part of the ProjectPath.
+        /// </summary>
+        public string EffectiveBasePath
+        {
+            get 
+            { 
+                return this.BasePath == null
+                    ? Path.GetDirectoryName(this.ProjectPath)
+                    : Path.Combine(
+                        Path.GetDirectoryName(this.ProjectPath),
+                        this.BasePath); 
+            }
+        }
+
+        public string ActiveConfigName
+        {
+            get { return doc.GetSettingsAttribute("activeconfig"); }
+            set { doc.SetSettingsAttribute("activeconfig", value); }
+        }
+
+        public string ProcessModel
+        {
+            get { return doc.GetSettingsAttribute("processModel") ?? "Default"; }
+            set { doc.SetSettingsAttribute("processModel", value.ToString()); }
+        }
+
+        public string DomainUsage
+        {
+            get { return doc.GetSettingsAttribute("domainUsage") ?? "Default"; }
+            set { doc.SetSettingsAttribute("domainUsage", value.ToString()); }
+        }
+
+        public ConfigList Configs
+        {
+            get { return new ConfigList(this); }
+        }
+
+        public string[] ConfigNames
+        {
+            get
+            {
+                string[] configList = new string[Configs.Count];
+                for (int i = 0; i < Configs.Count; i++)
+                    configList[i] = Configs[i].Name;
+
+                return configList;
+            }
+        }
+
+        public IProjectConfig AddConfig(string name)
+        {
+            XmlNode configNode = XmlHelper.AddElement(doc.RootNode, "Config");
+            XmlHelper.AddAttribute(configNode, "name", name);
+
+            return new ProjectConfig(this, configNode);
+        }
+
+        public void RemoveConfigAt(int index)
+        {
+            bool itWasActive = ActiveConfigName == Configs[index].Name;
+
+            doc.RootNode.RemoveChild(doc.ConfigNodes[index]);
+            
+            if (itWasActive)
+                doc.RemoveSettingsAttribute("activeconfig");
+        }
+
+        public void RemoveConfig(string name)
+        {
+            int index = IndexOf(name);
+            if (index >= 0)
+            {
+                RemoveConfigAt(index);
+            }
+        }
+
+        #endregion
+
+        #region Helper Properties and Methods
+
+        private int IndexOf(string name)
+        {
+            for (int index = 0; index < doc.ConfigNodes.Count; index++)
+            {
+                if (XmlHelper.GetAttribute(doc.ConfigNodes[index], "name") == name)
+                    return index;
+            }
+
+            return -1;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/PropertyPresenter.cs b/src/ProjectEditor/editor/PropertyEditor/PropertyPresenter.cs
new file mode 100644
index 0000000..3b0214e
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyPresenter.cs
@@ -0,0 +1,493 @@
+// ****************************************************************
+// 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.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Text;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// The ProjectPresenter handles presentation of the doc as
+    /// a set of properties, which the ProjectView is expected to
+    /// display.
+    /// </summary>
+    public class PropertyPresenter
+    {
+        private IProjectModel model;
+        private IProjectConfig selectedConfig;
+        private IPropertyView view;
+
+        public PropertyPresenter(IProjectModel model, IPropertyView view)
+        {
+            this.model = model;
+            this.view = view;
+
+            view.ProcessModel.SelectionList = new string[] { "Default", "Single", "Separate", "Multiple" };
+            view.DomainUsage.SelectionList = new string[] { "Default", "Single", "Multiple" };
+            view.Runtime.SelectionList = new string[] { "Any", "Net", "Mono" };
+            view.RuntimeVersion.SelectionList = new string[] { "1.0.3705", "1.1.4322", "2.0.50727", "4.0.21006" };
+
+            view.BrowseProjectBaseCommand.Execute += BrowseForProjectBase;
+            view.BrowseConfigBaseCommand.Execute += BrowseForConfigBase;
+            view.EditConfigsCommand.Execute += EditConfigs;
+
+            view.AddAssemblyCommand.Execute += AddAssembly;
+            view.RemoveAssemblyCommand.Execute += RemoveAssembly;
+            view.BrowseAssemblyPathCommand.Execute += BrowseForAssemblyPath;
+
+            view.ProjectBase.Validated += OnProjectBaseChange;
+            view.ProcessModel.SelectionChanged += OnProcessModelChange;
+            view.DomainUsage.SelectionChanged += OnDomainUsageChange;
+            view.ConfigList.SelectionChanged += OnSelectedConfigChange;
+
+            view.Runtime.SelectionChanged += OnRuntimeChange;
+            view.RuntimeVersion.TextValidated += OnRuntimeVersionChange;
+            view.ApplicationBase.Validated += OnApplicationBaseChange;
+            view.ConfigurationFile.Validated += OnConfigurationFileChange;
+            view.BinPathType.SelectionChanged += OnBinPathTypeChange;
+            view.PrivateBinPath.Validated += OnPrivateBinPathChange;
+            view.AssemblyList.SelectionChanged += OnSelectedAssemblyChange;
+            view.AssemblyPath.Validated += OnAssemblyPathChange;
+
+            model.Document.ProjectCreated += OnProjectCreated;
+            model.Document.ProjectClosed += OnProjectClosed;
+        }
+
+        public void LoadViewFromModel()
+        {
+            view.Visible = true;
+
+            view.ProjectPath.Text = model.ProjectPath;
+            view.ProjectBase.Text = model.EffectiveBasePath;
+            view.ActiveConfigName.Text = model.ActiveConfigName;
+
+            view.ProcessModel.SelectedItem = model.ProcessModel;
+            view.DomainUsage.SelectedItem = model.DomainUsage;
+
+            view.ConfigList.SelectionList = model.ConfigNames;
+            if (model.ConfigNames.Length > 0)
+            {
+                view.ConfigList.SelectedIndex = 0;
+                selectedConfig = model.Configs[0];
+            }
+            else
+            {
+                view.ConfigList.SelectedIndex = -1;
+                selectedConfig = null;
+            }
+
+            //OnSelectedConfigChange();
+        }
+
+        #region Command Events
+
+        private void BrowseForProjectBase()
+        {
+            string message = "Select ApplicationBase for the model as a whole.";
+            string projectBase = view.DialogManager.GetFolderPath(message, view.ProjectBase.Text);
+            if (projectBase != null && projectBase != model.BasePath)
+                view.ProjectBase.Text = model.BasePath = projectBase;
+        }
+
+        private void BrowseForConfigBase()
+        {
+            string message = string.Format(
+                "Select ApplicationBase for the {0} configuration, if different from the model as a whole.",
+                model.Configs[view.ConfigList.SelectedIndex].Name);
+            string initialFolder = view.ApplicationBase.Text;
+            if (initialFolder == string.Empty)
+                initialFolder = view.ProjectBase.Text;
+
+            string appbase = view.DialogManager.GetFolderPath(message, initialFolder);
+            if (appbase != null && appbase != view.ApplicationBase.Text)
+                UpdateApplicationBase(appbase);
+        }
+
+        private void EditConfigs()
+        {
+            IConfigurationEditorDialog editorView = view.ConfigurationEditorDialog;
+            new ConfigurationEditor(model, editorView);
+            editorView.ShowDialog();
+
+            string selectedConfig = view.ConfigList.SelectedItem;
+            string[] configs = model.ConfigNames;
+
+            view.ConfigList.SelectionList = configs;
+
+            if (configs.Length > 0)
+            {
+                view.ConfigList.SelectedIndex = 0;
+                foreach (string config in configs)
+                {
+                    if (config == selectedConfig)
+                        view.ConfigList.SelectedItem = config;
+                }
+            }
+
+            view.ActiveConfigName.Text = model.ActiveConfigName;
+        }
+
+        private void AddAssembly()
+        {
+            string assemblyPath = view.DialogManager.GetFileOpenPath(
+                "Select Assembly",
+                "Assemblies (*.dll,*.exe)|*.dll;*.exe|All Files (*.*)|*.*",
+                view.AssemblyPath.Text);
+
+            if (assemblyPath != null)
+            {
+                assemblyPath = PathUtils.RelativePath(selectedConfig.EffectiveBasePath, assemblyPath);
+                selectedConfig.Assemblies.Add(assemblyPath);
+                SetAssemblyList();
+            }
+        }
+
+        private void RemoveAssembly()
+        {
+            string question = string.Format("Remove {0} from project?", view.AssemblyList.SelectedItem);
+            if (view.MessageDisplay.AskYesNoQuestion(question))
+            {
+                selectedConfig.Assemblies.Remove(view.AssemblyList.SelectedItem);
+                SetAssemblyList();
+            }
+        }
+
+        private void BrowseForAssemblyPath()
+        {
+            string assemblyPath = view.DialogManager.GetFileOpenPath(
+                "Select Assembly",
+                "Assemblies (*.dll,*.exe)|*.dll;*.exe|All Files (*.*)|*.*",
+                view.AssemblyPath.Text);
+
+            if (assemblyPath != null)
+            {
+                selectedConfig.Assemblies[view.AssemblyList.SelectedIndex] = assemblyPath;
+                SetAssemblyList();
+            }
+        }
+
+        #endregion
+
+        #region View Change Events
+
+        private void OnProjectBaseChange()
+        {
+            string projectBase = view.ProjectBase.Text;
+
+            if (projectBase == string.Empty)
+                view.ProjectBase.Text = projectBase = Path.GetDirectoryName(model.ProjectPath);
+
+            if (ValidateDirectoryPath("ProjectBase", projectBase))
+                model.BasePath = projectBase;
+        }
+
+        private void OnProcessModelChange()
+        {
+            model.ProcessModel = view.ProcessModel.SelectedItem;
+            view.DomainUsage.SelectionList = view.ProcessModel.SelectedItem == "Multiple"
+                ? new string[] { "Default", "Single" }
+                : new string[] { "Default", "Single", "Multiple" };
+        }
+
+        private void OnDomainUsageChange()
+        {
+            model.DomainUsage = view.DomainUsage.SelectedItem;
+        }
+
+        private void OnSelectedConfigChange()
+        {
+            IProjectConfig selectedConfig = view.ConfigList.SelectedIndex >= 0
+                ? model.Configs[view.ConfigList.SelectedIndex]
+                : null;
+
+            if (selectedConfig != null)
+            {
+                RuntimeFramework framework = selectedConfig.RuntimeFramework;
+                view.Runtime.SelectedItem = framework.Runtime.ToString();
+                view.RuntimeVersion.Text = framework.Version == new Version()
+                    ? string.Empty
+                    : framework.Version.ToString();
+
+                view.ApplicationBase.Text = selectedConfig.RelativeBasePath;
+                view.ConfigurationFile.Text = selectedConfig.ConfigurationFile;
+                view.BinPathType.SelectedIndex = (int)selectedConfig.BinPathType;
+                if (selectedConfig.BinPathType == BinPathType.Manual)
+                    view.PrivateBinPath.Text = selectedConfig.PrivateBinPath;
+                else
+                    view.PrivateBinPath.Text = string.Empty;
+
+                SetAssemblyList();
+            }
+            else
+            {
+                view.Runtime.SelectedItem = "Any";
+                view.RuntimeVersion.Text = string.Empty;
+
+                view.ApplicationBase.Text = null;
+                view.ConfigurationFile.Text = string.Empty;
+                view.PrivateBinPath.Text = string.Empty;
+                view.BinPathType.SelectedIndex = (int)BinPathType.Auto;
+
+                view.AssemblyList.SelectionList = new string[0];
+                view.AssemblyPath.Text = string.Empty;
+            }
+        }
+
+        #region Changes Pertaining to Selected Config
+
+        private void OnRuntimeChange()
+        {
+            try
+            {
+                if (selectedConfig != null)
+                    selectedConfig.RuntimeFramework = new RuntimeFramework(
+                        (RuntimeType)Enum.Parse(typeof(RuntimeType), view.Runtime.SelectedItem),
+                        selectedConfig.RuntimeFramework.Version);
+            }
+            catch(Exception ex)
+            {
+                // Note: Should not be called with an invalid value,
+                // but we catch and report the error in any case
+                view.MessageDisplay.Error("Invalid Runtime: " + ex.Message);
+            }
+        }
+
+        private void OnRuntimeVersionChange()
+        {
+            if (selectedConfig != null)
+            {
+                try
+                {
+                    Version version = string.IsNullOrEmpty(view.RuntimeVersion.Text)
+                        ? new Version()
+                        : new Version(view.RuntimeVersion.Text);
+                    selectedConfig.RuntimeFramework = new RuntimeFramework(
+                        selectedConfig.RuntimeFramework.Runtime,
+                        version);
+                }
+                catch (Exception ex)
+                {
+                    // User entered an bad value for the version
+                    view.MessageDisplay.Error("Invalid RuntimeVersion: " + ex.Message);
+                }
+            }
+        }
+
+        private void OnApplicationBaseChange()
+        {
+            if (selectedConfig != null)
+            {
+                string basePath = null;
+
+                if (view.ApplicationBase.Text != String.Empty)
+                {
+                    if (!ValidateDirectoryPath("ApplicationBase", view.ApplicationBase.Text))
+                        return;
+
+                    basePath = Path.Combine(model.BasePath, view.ApplicationBase.Text);
+                    if (PathUtils.SamePath(model.BasePath, basePath))
+                        basePath = null;
+                }
+
+                selectedConfig.BasePath = basePath;
+
+                // TODO: Test what happens if we set it the same as doc base
+                //if (index.RelativeBasePath == null)
+                //    view.ApplicationBase.Text = string.Empty;
+                //else
+                //    view.ApplicationBase.Text = index.RelativeBasePath;
+            }
+        }
+
+        private void OnConfigurationFileChange()
+        {
+            if (selectedConfig != null)
+            {
+                string configFile = view.ConfigurationFile.Text;
+
+                if (configFile == string.Empty)
+                    selectedConfig.ConfigurationFile = null;
+                else if (ValidateFilePath("DefaultConfigurationFile", configFile))
+                {
+                    if (configFile == Path.GetFileName(configFile))
+                        selectedConfig.ConfigurationFile = view.ConfigurationFile.Text;
+                    else
+                        view.MessageDisplay.Error("ConfigurationFile must be specified as a file name only - without directory path. The configuration file is always located in the application base directory.");
+                }
+            }
+        }
+
+        private void OnBinPathTypeChange()
+        {
+            if (selectedConfig != null)
+                selectedConfig.BinPathType = (BinPathType)view.BinPathType.SelectedIndex;
+            view.PrivateBinPath.Enabled = view.BinPathType.SelectedIndex == (int)BinPathType.Manual;
+        }
+
+        private void OnPrivateBinPathChange()
+        {
+            if (selectedConfig != null)
+            {
+                if (view.PrivateBinPath.Text == string.Empty)
+                    selectedConfig.PrivateBinPath = null;
+                else
+                {
+                    foreach (string dir in view.PrivateBinPath.Text.Split(Path.PathSeparator))
+                    {
+                        if (!ValidateDirectoryPath("PrivateBinPath", dir))
+                            return;
+                        if (Path.IsPathRooted(dir))
+                        {
+                            view.MessageDisplay.Error("Path " + dir + " is an absolute path. PrivateBinPath components must all be relative paths.");
+                            return;
+                        }
+                    }
+
+                    selectedConfig.PrivateBinPath = view.PrivateBinPath.Text;
+                }
+            }
+        }
+
+        private void OnSelectedAssemblyChange()
+        {
+            if (view.AssemblyList.SelectedIndex == -1)
+            {
+                view.AssemblyPath.Text = null;
+                view.AddAssemblyCommand.Enabled = true;
+                view.RemoveAssemblyCommand.Enabled = false;
+                view.BrowseAssemblyPathCommand.Enabled = false;
+            }
+            else if (selectedConfig != null)
+            {
+                view.AssemblyPath.Text =
+                    selectedConfig.Assemblies[view.AssemblyList.SelectedIndex];
+                view.AddAssemblyCommand.Enabled = true;
+                view.RemoveAssemblyCommand.Enabled = true;
+                view.BrowseAssemblyPathCommand.Enabled = true;
+            }
+        }
+
+        private void OnAssemblyPathChange()
+        {
+            if (selectedConfig != null && ValidateFilePath("AssemblyPath", view.AssemblyPath.Text))
+            {
+                selectedConfig.Assemblies[view.AssemblyList.SelectedIndex] = view.AssemblyPath.Text;
+                SetAssemblyList();
+            }
+        }
+
+        #endregion
+
+        #endregion
+
+        #region Model Change Events
+
+        private void OnProjectCreated()
+        {
+            view.Visible = true;
+            if (model.Document.RootNode != null)
+                LoadViewFromModel();
+        }
+
+        private void OnProjectClosed()
+        {
+            view.Visible = false;
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private void UpdateApplicationBase(string appbase)
+        {
+            string basePath = null;
+
+            if (appbase != String.Empty)
+            {
+                basePath = Path.Combine(model.BasePath, appbase);
+                if (PathUtils.SamePath(model.BasePath, basePath))
+                    basePath = null;
+            }
+
+            IProjectConfig selectedConfig = model.Configs[view.ConfigList.SelectedIndex];
+            view.ApplicationBase.Text = selectedConfig.BasePath = basePath;
+
+            // TODO: Test what happens if we set it the same as doc base
+            //if (index.RelativeBasePath == null)
+            //    applicationBaseTextBox.Text = string.Empty;
+            //else
+            //    applicationBaseTextBox.Text = index.RelativeBasePath;
+        }
+
+        private void SetAssemblyList()
+        {
+            IProjectConfig config = model.Configs[view.ConfigList.SelectedIndex];
+            string[] list = new string[config.Assemblies.Count];
+            
+            for (int i = 0; i < list.Length; i++)
+                list[i] = config.Assemblies[i];
+
+            view.AssemblyList.SelectionList = list;
+            if (list.Length > 0)
+            {
+                view.AssemblyList.SelectedIndex = 0;
+                view.AssemblyPath.Text = list[0];
+            }
+            else
+            {
+                view.AssemblyList.SelectedIndex = -1;
+                view.AssemblyPath.Text = string.Empty;
+            }
+        }
+
+        private bool ValidateDirectoryPath(string property, string path)
+        {
+            try
+            {
+                new DirectoryInfo(path);
+                return true;
+            }
+            catch (Exception ex)
+            {
+                view.MessageDisplay.Error(string.Format("Invalid directory path for {0}: {1}", property, ex.Message));
+                return false;
+            }
+        }
+
+        private bool ValidateFilePath(string property, string path)
+        {
+            try
+            {
+                new FileInfo(path);
+                return true;
+            }
+            catch (Exception ex)
+            {
+                view.MessageDisplay.Error(string.Format("Invalid file path for {0}: {1}", property, ex.Message));
+                return false;
+            }
+        }
+
+        public string[] ConfigNames
+        {
+            get
+            {
+                ConfigList configs = model.Configs;
+
+                string[] configList = new string[configs.Count];
+                for (int i = 0; i < configs.Count; i++)
+                    configList[i] = configs[i].Name;
+
+                return configList;
+            }
+        }
+        
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/PropertyView.Designer.cs b/src/ProjectEditor/editor/PropertyEditor/PropertyView.Designer.cs
new file mode 100644
index 0000000..92511ba
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyView.Designer.cs
@@ -0,0 +1,563 @@
+namespace NUnit.ProjectEditor
+{
+    partial class PropertyView
+    {
+        /// <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 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.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PropertyView));
+            this.domainUsageComboBox = new System.Windows.Forms.ComboBox();
+            this.processModelComboBox = new System.Windows.Forms.ComboBox();
+            this.label10 = new System.Windows.Forms.Label();
+            this.label9 = new System.Windows.Forms.Label();
+            this.projectBaseBrowseButton = new System.Windows.Forms.Button();
+            this.projectBaseTextBox = new System.Windows.Forms.TextBox();
+            this.label8 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.projectPathLabel = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            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.label12 = new System.Windows.Forms.Label();
+            this.activeConfigLabel = new System.Windows.Forms.Label();
+            this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);
+            this.groupBox1.SuspendLayout();
+            this.projectTabControl.SuspendLayout();
+            this.generalTabPage.SuspendLayout();
+            this.assemblyTabPage.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // domainUsageComboBox
+            // 
+            this.domainUsageComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.domainUsageComboBox.Items.AddRange(new object[] {
+            "Default"});
+            this.domainUsageComboBox.Location = new System.Drawing.Point(262, 65);
+            this.domainUsageComboBox.Margin = new System.Windows.Forms.Padding(2);
+            this.domainUsageComboBox.Name = "domainUsageComboBox";
+            this.domainUsageComboBox.Size = new System.Drawing.Size(76, 21);
+            this.domainUsageComboBox.TabIndex = 22;
+            // 
+            // processModelComboBox
+            // 
+            this.processModelComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.processModelComboBox.Items.AddRange(new object[] {
+            "Default"});
+            this.processModelComboBox.Location = new System.Drawing.Point(91, 65);
+            this.processModelComboBox.Margin = new System.Windows.Forms.Padding(2);
+            this.processModelComboBox.Name = "processModelComboBox";
+            this.processModelComboBox.Size = new System.Drawing.Size(80, 21);
+            this.processModelComboBox.TabIndex = 21;
+            // 
+            // label10
+            // 
+            this.label10.Location = new System.Drawing.Point(178, 69);
+            this.label10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(84, 13);
+            this.label10.TabIndex = 20;
+            this.label10.Text = "Domain Usage:";
+            // 
+            // label9
+            // 
+            this.label9.Location = new System.Drawing.Point(4, 69);
+            this.label9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(82, 13);
+            this.label9.TabIndex = 19;
+            this.label9.Text = "Process Model:";
+            // 
+            // projectBaseBrowseButton
+            // 
+            this.projectBaseBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.projectBaseBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("projectBaseBrowseButton.Image")));
+            this.projectBaseBrowseButton.Location = new System.Drawing.Point(491, 36);
+            this.projectBaseBrowseButton.Margin = new System.Windows.Forms.Padding(2);
+            this.projectBaseBrowseButton.Name = "projectBaseBrowseButton";
+            this.projectBaseBrowseButton.Size = new System.Drawing.Size(18, 16);
+            this.projectBaseBrowseButton.TabIndex = 18;
+            // 
+            // projectBaseTextBox
+            // 
+            this.projectBaseTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.projectBaseTextBox.Location = new System.Drawing.Point(73, 34);
+            this.projectBaseTextBox.Margin = new System.Windows.Forms.Padding(2);
+            this.projectBaseTextBox.Name = "projectBaseTextBox";
+            this.projectBaseTextBox.Size = new System.Drawing.Size(404, 20);
+            this.projectBaseTextBox.TabIndex = 17;
+            // 
+            // label8
+            // 
+            this.label8.Location = new System.Drawing.Point(4, 35);
+            this.label8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(75, 17);
+            this.label8.TabIndex = 16;
+            this.label8.Text = "Project Base:";
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(4, 4);
+            this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(63, 18);
+            this.label5.TabIndex = 15;
+            this.label5.Text = "Project Path:";
+            // 
+            // projectPathLabel
+            // 
+            this.projectPathLabel.AutoSize = true;
+            this.projectPathLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.projectPathLabel.Location = new System.Drawing.Point(75, 4);
+            this.projectPathLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.projectPathLabel.Name = "projectPathLabel";
+            this.projectPathLabel.Size = new System.Drawing.Size(0, 13);
+            this.projectPathLabel.TabIndex = 23;
+            // 
+            // 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(10, 103);
+            this.groupBox1.Margin = new System.Windows.Forms.Padding(2);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Padding = new System.Windows.Forms.Padding(2);
+            this.groupBox1.Size = new System.Drawing.Size(500, 297);
+            this.groupBox1.TabIndex = 24;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Configuration Properties";
+            // 
+            // 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(5, 67);
+            this.projectTabControl.Margin = new System.Windows.Forms.Padding(2);
+            this.projectTabControl.Name = "projectTabControl";
+            this.projectTabControl.SelectedIndex = 0;
+            this.projectTabControl.Size = new System.Drawing.Size(488, 226);
+            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.Margin = new System.Windows.Forms.Padding(2);
+            this.generalTabPage.Name = "generalTabPage";
+            this.generalTabPage.Size = new System.Drawing.Size(480, 200);
+            this.generalTabPage.TabIndex = 0;
+            this.generalTabPage.Text = "General";
+            // 
+            // runtimeVersionComboBox
+            // 
+            this.runtimeVersionComboBox.Location = new System.Drawing.Point(240, 13);
+            this.runtimeVersionComboBox.Margin = new System.Windows.Forms.Padding(2);
+            this.runtimeVersionComboBox.Name = "runtimeVersionComboBox";
+            this.runtimeVersionComboBox.Size = new System.Drawing.Size(77, 21);
+            this.runtimeVersionComboBox.TabIndex = 14;
+            // 
+            // label11
+            // 
+            this.label11.Location = new System.Drawing.Point(144, 15);
+            this.label11.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(92, 13);
+            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"});
+            this.runtimeComboBox.Location = new System.Drawing.Point(65, 13);
+            this.runtimeComboBox.Margin = new System.Windows.Forms.Padding(2);
+            this.runtimeComboBox.Name = "runtimeComboBox";
+            this.runtimeComboBox.Size = new System.Drawing.Size(62, 21);
+            this.runtimeComboBox.TabIndex = 12;
+            // 
+            // label7
+            // 
+            this.label7.Location = new System.Drawing.Point(10, 15);
+            this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(51, 13);
+            this.label7.TabIndex = 11;
+            this.label7.Text = "Runtime:";
+            // 
+            // autoBinPathRadioButton
+            // 
+            this.autoBinPathRadioButton.Location = new System.Drawing.Point(18, 125);
+            this.autoBinPathRadioButton.Margin = new System.Windows.Forms.Padding(2);
+            this.autoBinPathRadioButton.Name = "autoBinPathRadioButton";
+            this.autoBinPathRadioButton.Size = new System.Drawing.Size(205, 17);
+            this.autoBinPathRadioButton.TabIndex = 10;
+            this.autoBinPathRadioButton.Text = "Use automatically generated path";
+            // 
+            // manualBinPathRadioButton
+            // 
+            this.manualBinPathRadioButton.Location = new System.Drawing.Point(18, 151);
+            this.manualBinPathRadioButton.Margin = new System.Windows.Forms.Padding(2);
+            this.manualBinPathRadioButton.Name = "manualBinPathRadioButton";
+            this.manualBinPathRadioButton.Size = new System.Drawing.Size(76, 16);
+            this.manualBinPathRadioButton.TabIndex = 9;
+            this.manualBinPathRadioButton.Text = "Use this path:";
+            // 
+            // noBinPathRadioButton
+            // 
+            this.noBinPathRadioButton.Location = new System.Drawing.Point(18, 177);
+            this.noBinPathRadioButton.Margin = new System.Windows.Forms.Padding(2);
+            this.noBinPathRadioButton.Name = "noBinPathRadioButton";
+            this.noBinPathRadioButton.Size = new System.Drawing.Size(265, 17);
+            this.noBinPathRadioButton.TabIndex = 8;
+            this.noBinPathRadioButton.Text = "None - or specified in Configuration File";
+            // 
+            // configBaseBrowseButton
+            // 
+            this.configBaseBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.configBaseBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("configBaseBrowseButton.Image")));
+            this.configBaseBrowseButton.Location = new System.Drawing.Point(454, 46);
+            this.configBaseBrowseButton.Margin = new System.Windows.Forms.Padding(2);
+            this.configBaseBrowseButton.Name = "configBaseBrowseButton";
+            this.configBaseBrowseButton.Size = new System.Drawing.Size(15, 16);
+            this.configBaseBrowseButton.TabIndex = 7;
+            // 
+            // privateBinPathTextBox
+            // 
+            this.privateBinPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.privateBinPathTextBox.Location = new System.Drawing.Point(108, 151);
+            this.privateBinPathTextBox.Margin = new System.Windows.Forms.Padding(2);
+            this.privateBinPathTextBox.Name = "privateBinPathTextBox";
+            this.privateBinPathTextBox.Size = new System.Drawing.Size(365, 20);
+            this.privateBinPathTextBox.TabIndex = 5;
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(6, 106);
+            this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(80, 13);
+            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.configFileTextBox.Location = new System.Drawing.Point(126, 78);
+            this.configFileTextBox.Margin = new System.Windows.Forms.Padding(2);
+            this.configFileTextBox.Name = "configFileTextBox";
+            this.configFileTextBox.Size = new System.Drawing.Size(347, 20);
+            this.configFileTextBox.TabIndex = 3;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(6, 80);
+            this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(122, 13);
+            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.applicationBaseTextBox.Location = new System.Drawing.Point(96, 46);
+            this.applicationBaseTextBox.Margin = new System.Windows.Forms.Padding(2);
+            this.applicationBaseTextBox.Name = "applicationBaseTextBox";
+            this.applicationBaseTextBox.Size = new System.Drawing.Size(353, 20);
+            this.applicationBaseTextBox.TabIndex = 1;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(6, 46);
+            this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(86, 13);
+            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.Margin = new System.Windows.Forms.Padding(2);
+            this.assemblyTabPage.Name = "assemblyTabPage";
+            this.assemblyTabPage.Size = new System.Drawing.Size(480, 200);
+            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.assemblyPathBrowseButton.Image = ((System.Drawing.Image)(resources.GetObject("assemblyPathBrowseButton.Image")));
+            this.assemblyPathBrowseButton.Location = new System.Drawing.Point(428, 169);
+            this.assemblyPathBrowseButton.Margin = new System.Windows.Forms.Padding(2);
+            this.assemblyPathBrowseButton.Name = "assemblyPathBrowseButton";
+            this.assemblyPathBrowseButton.Size = new System.Drawing.Size(15, 16);
+            this.assemblyPathBrowseButton.TabIndex = 11;
+            // 
+            // 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(10, 169);
+            this.assemblyPathTextBox.Margin = new System.Windows.Forms.Padding(2);
+            this.assemblyPathTextBox.Name = "assemblyPathTextBox";
+            this.assemblyPathTextBox.Size = new System.Drawing.Size(405, 20);
+            this.assemblyPathTextBox.TabIndex = 8;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(10, 155);
+            this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(80, 11);
+            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.assemblyListBox.Location = new System.Drawing.Point(10, 20);
+            this.assemblyListBox.Margin = new System.Windows.Forms.Padding(2);
+            this.assemblyListBox.Name = "assemblyListBox";
+            this.assemblyListBox.Size = new System.Drawing.Size(370, 121);
+            this.assemblyListBox.TabIndex = 6;
+            // 
+            // addAssemblyButton
+            // 
+            this.addAssemblyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.addAssemblyButton.Location = new System.Drawing.Point(385, 17);
+            this.addAssemblyButton.Margin = new System.Windows.Forms.Padding(2);
+            this.addAssemblyButton.Name = "addAssemblyButton";
+            this.addAssemblyButton.Size = new System.Drawing.Size(58, 27);
+            this.addAssemblyButton.TabIndex = 2;
+            this.addAssemblyButton.Text = "&Add...";
+            // 
+            // removeAssemblyButton
+            // 
+            this.removeAssemblyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.removeAssemblyButton.Location = new System.Drawing.Point(385, 49);
+            this.removeAssemblyButton.Margin = new System.Windows.Forms.Padding(2);
+            this.removeAssemblyButton.Name = "removeAssemblyButton";
+            this.removeAssemblyButton.Size = new System.Drawing.Size(58, 23);
+            this.removeAssemblyButton.TabIndex = 5;
+            this.removeAssemblyButton.Text = "&Remove";
+            // 
+            // editConfigsButton
+            // 
+            this.editConfigsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.editConfigsButton.Location = new System.Drawing.Point(379, 27);
+            this.editConfigsButton.Margin = new System.Windows.Forms.Padding(2);
+            this.editConfigsButton.Name = "editConfigsButton";
+            this.editConfigsButton.Size = new System.Drawing.Size(110, 21);
+            this.editConfigsButton.TabIndex = 8;
+            this.editConfigsButton.Text = "&Edit Configs...";
+            // 
+            // configComboBox
+            // 
+            this.configComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.configComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.configComboBox.ItemHeight = 13;
+            this.configComboBox.Location = new System.Drawing.Point(81, 28);
+            this.configComboBox.Margin = new System.Windows.Forms.Padding(2);
+            this.configComboBox.Name = "configComboBox";
+            this.configComboBox.Size = new System.Drawing.Size(294, 21);
+            this.configComboBox.TabIndex = 7;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(10, 28);
+            this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(76, 20);
+            this.label1.TabIndex = 6;
+            this.label1.Text = "Configuration:";
+            // 
+            // label12
+            // 
+            this.label12.AutoSize = true;
+            this.label12.Location = new System.Drawing.Point(358, 69);
+            this.label12.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(73, 13);
+            this.label12.TabIndex = 25;
+            this.label12.Text = "Active Config:";
+            // 
+            // activeConfigLabel
+            // 
+            this.activeConfigLabel.AutoSize = true;
+            this.activeConfigLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.activeConfigLabel.Location = new System.Drawing.Point(433, 68);
+            this.activeConfigLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.activeConfigLabel.Name = "activeConfigLabel";
+            this.activeConfigLabel.Size = new System.Drawing.Size(0, 13);
+            this.activeConfigLabel.TabIndex = 26;
+            // 
+            // errorProvider1
+            // 
+            this.errorProvider1.ContainerControl = this;
+            // 
+            // PropertyView
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.Controls.Add(this.activeConfigLabel);
+            this.Controls.Add(this.label12);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.projectPathLabel);
+            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.projectBaseTextBox);
+            this.Controls.Add(this.label8);
+            this.Controls.Add(this.label5);
+            this.Margin = new System.Windows.Forms.Padding(2);
+            this.Name = "PropertyView";
+            this.Size = new System.Drawing.Size(526, 403);
+            this.groupBox1.ResumeLayout(false);
+            this.projectTabControl.ResumeLayout(false);
+            this.generalTabPage.ResumeLayout(false);
+            this.generalTabPage.PerformLayout();
+            this.assemblyTabPage.ResumeLayout(false);
+            this.assemblyTabPage.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.ComboBox domainUsageComboBox;
+        private System.Windows.Forms.ComboBox processModelComboBox;
+        private System.Windows.Forms.Label label10;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.Button projectBaseBrowseButton;
+        private System.Windows.Forms.TextBox projectBaseTextBox;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label projectPathLabel;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.TabControl projectTabControl;
+        private System.Windows.Forms.TabPage generalTabPage;
+        private System.Windows.Forms.ComboBox runtimeVersionComboBox;
+        private System.Windows.Forms.Label label11;
+        private System.Windows.Forms.ComboBox runtimeComboBox;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.RadioButton autoBinPathRadioButton;
+        private System.Windows.Forms.RadioButton manualBinPathRadioButton;
+        private System.Windows.Forms.RadioButton noBinPathRadioButton;
+        private System.Windows.Forms.Button configBaseBrowseButton;
+        private System.Windows.Forms.TextBox privateBinPathTextBox;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.TextBox configFileTextBox;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox applicationBaseTextBox;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TabPage assemblyTabPage;
+        private System.Windows.Forms.Button assemblyPathBrowseButton;
+        private System.Windows.Forms.TextBox assemblyPathTextBox;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.ListBox assemblyListBox;
+        private System.Windows.Forms.Button addAssemblyButton;
+        private System.Windows.Forms.Button removeAssemblyButton;
+        private System.Windows.Forms.Button editConfigsButton;
+        private System.Windows.Forms.ComboBox configComboBox;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label12;
+        private System.Windows.Forms.Label activeConfigLabel;
+        private System.Windows.Forms.ErrorProvider errorProvider1;
+
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/PropertyView.cs b/src/ProjectEditor/editor/PropertyEditor/PropertyView.cs
new file mode 100644
index 0000000..5de4895
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyView.cs
@@ -0,0 +1,236 @@
+// ****************************************************************
+// 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.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public partial class PropertyView : UserControl, IPropertyView
+    {
+        #region Instance Variables
+
+        private IDialogManager dialogManager;
+        private IMessageDisplay messageDisplay;
+
+        private ICommand browseProjectBaseCommand;
+        private ICommand editConfigsCommand;
+        private ICommand browseConfigBaseCommand;
+        private ICommand addAssemblyCommand;
+        private ICommand removeAssemblyCommand;
+        private ICommand browseAssemblyPathCommand;
+
+        private ITextElement projectPath;
+        private ITextElement projectBase;
+        private ISelectionList processModel;
+        private ISelectionList domainUsage;
+        private ISelectionList runtime;
+        private IComboBox runtimeVersion;
+        private ITextElement activeConfigName;
+
+        private ISelectionList configList;
+
+        private ITextElement applicationBase;
+        private ITextElement configurationFile;
+        private ISelection binPathType;
+        private ITextElement privateBinPath;
+        private ISelectionList assemblyList;
+        private ITextElement assemblyPath;
+
+        #endregion
+
+        #region Constructor
+
+        public PropertyView()
+        {
+            InitializeComponent();
+
+            InitializeViewElements();
+        }
+
+        private void InitializeViewElements()
+        {
+            dialogManager = new DialogManager("NUnit Project Editor");
+            messageDisplay = new MessageDisplay("NUnit Project Editor");
+
+            browseProjectBaseCommand = new ButtonElement(projectBaseBrowseButton);
+            editConfigsCommand = new ButtonElement(editConfigsButton);
+            browseConfigBaseCommand = new ButtonElement(configBaseBrowseButton);
+            addAssemblyCommand = new ButtonElement(addAssemblyButton);
+            removeAssemblyCommand = new ButtonElement(removeAssemblyButton);
+            browseAssemblyPathCommand = new ButtonElement(assemblyPathBrowseButton);
+
+            projectPath = new TextElement(projectPathLabel);
+            projectBase = new TextElement(projectBaseTextBox);
+            processModel = new ComboBoxElement(processModelComboBox);
+            domainUsage = new ComboBoxElement(domainUsageComboBox);
+            runtime = new ComboBoxElement(runtimeComboBox);
+            runtimeVersion = new ComboBoxElement(runtimeVersionComboBox);
+            activeConfigName = new TextElement(activeConfigLabel);
+
+            configList = new ComboBoxElement(configComboBox);
+
+            applicationBase = new TextElement(applicationBaseTextBox);
+            configurationFile = new TextElement(configFileTextBox);
+            binPathType = new RadioButtonGroup("BinPathType", autoBinPathRadioButton, manualBinPathRadioButton, noBinPathRadioButton);
+            privateBinPath = new TextElement(privateBinPathTextBox);
+            assemblyPath = new TextElement(assemblyPathTextBox);
+            assemblyList = new ListBoxElement(assemblyListBox);
+        }
+
+        #endregion
+        
+        #region IPropertyView Members
+
+        public IDialogManager DialogManager 
+        {
+            get { return dialogManager; }
+        }
+
+        public IMessageDisplay MessageDisplay 
+        {
+            get { return messageDisplay; }
+        }
+
+        public IConfigurationEditorDialog ConfigurationEditorDialog 
+        {
+            get { return new ConfigurationEditorDialog(); }
+        }
+
+        public ICommand BrowseProjectBaseCommand 
+        {
+            get { return browseProjectBaseCommand; }
+        }
+
+        public ICommand EditConfigsCommand 
+        {
+            get { return editConfigsCommand; }
+        }
+
+        public ICommand BrowseConfigBaseCommand 
+        {
+            get { return browseConfigBaseCommand; }
+        }
+
+        public ICommand AddAssemblyCommand 
+        {
+            get { return addAssemblyCommand; }
+        }
+
+        public ICommand RemoveAssemblyCommand 
+        {
+            get { return removeAssemblyCommand; }
+        }
+
+        public ICommand BrowseAssemblyPathCommand 
+        {
+            get { return browseAssemblyPathCommand; }
+        }
+
+        public ITextElement ProjectPath
+        {
+            get { return projectPath; }
+        }
+
+        public ITextElement ProjectBase 
+        {
+            get { return projectBase; }
+        }
+
+        public ISelectionList ProcessModel 
+        {
+            get { return processModel; }
+        }
+
+        public ISelectionList DomainUsage 
+        {
+            get { return domainUsage; }
+        }
+
+        public ITextElement ActiveConfigName 
+        {
+            get { return activeConfigName; }
+        }
+
+        public ISelectionList ConfigList 
+        {
+            get { return configList; }
+        }
+
+        public ISelectionList Runtime 
+        {
+            get { return runtime; }
+        }
+
+        public IComboBox RuntimeVersion 
+        {
+            get { return runtimeVersion; }
+        }
+
+        public ITextElement ApplicationBase 
+        {
+            get { return applicationBase; }
+        }
+
+        public ITextElement ConfigurationFile 
+        {
+            get { return configurationFile; }
+        }
+
+        public ISelection BinPathType 
+        {
+            get { return binPathType; }
+        }
+
+        public ITextElement PrivateBinPath 
+        {
+            get { return privateBinPath; }
+        }
+
+        public ISelectionList AssemblyList 
+        {
+            get { return assemblyList; }
+        }
+
+        public ITextElement AssemblyPath 
+        {
+            get { return assemblyPath; }
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private string[] GetComboBoxOptions(ComboBox comboBox)
+        {
+            string[] options = new string[comboBox.Items.Count];
+
+            for (int i = 0; i < comboBox.Items.Count; i++)
+                options[i] = comboBox.Items[i].ToString();
+
+            return options;
+        }
+
+        private void SetComboBoxOptions(ComboBox comboBox, string[] options)
+        {
+            comboBox.Items.Clear();
+
+            foreach (object opt in options)
+                comboBox.Items.Add(opt);
+
+            if (comboBox.Items.Count > 0)
+                comboBox.SelectedIndex = 0;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/PropertyView.resx b/src/ProjectEditor/editor/PropertyEditor/PropertyView.resx
new file mode 100644
index 0000000..28331e0
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyView.resx
@@ -0,0 +1,145 @@
+<?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.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="projectBaseBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhCgAKAIMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
+        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAPACwAAAAACgAKAAAIHgAfCBxIsKDBgwgJAgAgcGHDhQwf
+        OJQYMaHFiwgDAgA7
+</value>
+  </data>
+  <data name="configBaseBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhCgAKAIMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
+        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAPACwAAAAACgAKAAAIHgAfCBxIsKDBgwgJAgAgcGHDhQwf
+        OJQYMaHFiwgDAgA7
+</value>
+  </data>
+  <data name="assemblyPathBrowseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        R0lGODlhCgAKAIMAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
+        /yH/C05FVFNDQVBFMi4wAwEBAAAh+QQBAAAPACwAAAAACgAKAAAIHgAfCBxIsKDBgwgJAgAgcGHDhQwf
+        OJQYMaHFiwgDAgA7
+</value>
+  </data>
+  <metadata name="errorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/PropertyEditor/RuntimeFramework.cs b/src/ProjectEditor/editor/PropertyEditor/RuntimeFramework.cs
new file mode 100644
index 0000000..4891394
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/RuntimeFramework.cs
@@ -0,0 +1,141 @@
+// ****************************************************************
+// 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.Reflection;
+using System.Collections;
+using Microsoft.Win32;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// Enumeration identifying a common language 
+	/// runtime implementation.
+	/// </summary>
+	public enum RuntimeType
+	{
+        /// <summary>AnyRuntime supported runtime framework</summary>
+        Any,
+		/// <summary>Microsoft .NET Framework</summary>
+		Net,
+		/// <summary>Microsoft .NET Compact Framework</summary>
+		NetCF,
+		/// <summary>Microsoft Shared Source CLI</summary>
+		SSCLI,
+		/// <summary>Mono</summary>
+		Mono
+	}
+
+	/// <summary>
+	/// RuntimeFramework encapsulates the naming standards
+    /// for identifying CLR implementations by runtime type
+    /// and version in the XML project file and elsewhere.
+	/// </summary>
+    [Serializable]
+	public sealed class RuntimeFramework
+    {
+        #region Instance Fields
+
+        private static readonly RuntimeFramework anyRuntime = new RuntimeFramework(RuntimeType.Any, new Version());
+
+        private RuntimeType runtime;
+        private Version version;
+
+        #endregion
+
+        #region Constructors
+
+        /// <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)
+		{
+			this.runtime = runtime;
+            this.version = version;
+        }
+
+        /// <summary>
+        /// Construct from a string
+        /// </summary>
+        /// <param name="s">A string representing the runtime</param>
+        public RuntimeFramework(string s)
+        {
+            runtime = RuntimeType.Any;
+            version = new Version();
+
+            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 (char.IsNumber(s[0]))
+            {
+                version = new Version(s);
+            }
+            else
+            {
+                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), s, true);
+                version = Environment.Version;
+            }
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Represents any runtime at all
+        /// </summary>
+        public static RuntimeFramework AnyRuntime
+        {
+            get { return anyRuntime; }
+        }
+
+        /// <summary>
+        /// The type of this runtime framework
+        /// </summary>
+        public RuntimeType Runtime
+        {
+            get { return runtime; }
+        }
+
+        /// <summary>
+        /// The version of this runtime framework
+        /// </summary>
+        public Version Version
+        {
+            get { return version; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        /// <summary>
+        /// Overridden to return the short name of the framework
+        /// </summary>
+        /// <returns></returns>
+		public override string ToString()
+		{
+            string vstring = version.ToString();
+            if (runtime == RuntimeType.Any)
+                return "v" + vstring;
+            else
+                return runtime.ToString().ToLower() + "-" + vstring;
+		}
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/VSProject.cs b/src/ProjectEditor/editor/PropertyEditor/VSProject.cs
new file mode 100644
index 0000000..4bb93be
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/VSProject.cs
@@ -0,0 +1,328 @@
+// ****************************************************************
+// 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.IO;
+using System.Xml;
+using System.Text.RegularExpressions;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// This class allows loading information about
+	/// configurations and assemblies in a Visual
+	/// Studio doc file and inspecting them.
+	/// Only the most common doc types are
+	/// supported and an exception is thrown if
+	/// an attempt is made to load an invalid
+	/// file or one of an unknown type.
+	/// </summary>
+	public class VSProject
+	{
+		#region Static and Instance Variables
+
+		/// <summary>
+		/// VS Project extentions
+		/// </summary>
+		private static readonly string[] validExtensions = { ".csproj", ".vbproj", ".vjsproj", ".vcproj" };
+		
+		/// <summary>
+		/// VS Solution extension
+		/// </summary>
+		private static readonly string solutionExtension = ".sln";
+
+		/// <summary>
+		/// Path to the file storing this doc
+		/// </summary>
+		private string projectPath;
+
+		/// <summary>
+		/// Collection of configs for the doc
+		/// </summary>
+		private VSProjectConfigCollection configs;
+
+		#endregion
+
+		#region Constructor
+
+		public VSProject( string projectPath )
+		{
+			this.projectPath = Path.GetFullPath( projectPath );
+			configs = new VSProjectConfigCollection();		
+
+			Load();
+		}
+
+		#endregion
+
+		#region Properties
+
+		/// <summary>
+		/// The name of the doc.
+		/// </summary>
+		public string Name
+		{
+			get { return Path.GetFileNameWithoutExtension( projectPath ); }
+		}
+
+		/// <summary>
+		/// The path to the doc
+		/// </summary>
+		public string ProjectPath
+		{
+			get { return projectPath; }
+		}
+
+		/// <summary>
+		/// Our collection of configurations
+		/// </summary>
+		public VSProjectConfigCollection Configs
+		{
+			get { return configs; }
+		}
+
+		#endregion
+
+		#region Static Methods
+
+		public static bool IsProjectFile( string path )
+		{
+            if (path.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
+                return false;
+
+			if ( path.ToLower().IndexOf( "http:" ) >= 0 )
+				return false;
+		
+			string extension = Path.GetExtension( path );
+
+			foreach( string validExtension in validExtensions )
+				if ( extension == validExtension )
+					return true;
+
+			return false;
+		}
+
+		public static bool IsSolutionFile( string path )
+		{
+			return Path.GetExtension( path ) == solutionExtension;
+		}
+
+		#endregion
+
+		#region Instance Methods
+
+		private void Load()
+		{
+			if ( !IsProjectFile( projectPath ) ) 
+				ThrowInvalidFileType( projectPath );
+
+			string projectDirectory = Path.GetFullPath( Path.GetDirectoryName( projectPath ) );
+			StreamReader rdr = new StreamReader( projectPath, System.Text.Encoding.UTF8 );
+			string[] extensions = {"", ".exe", ".dll", ".lib", "" };
+			
+			try
+			{
+				XmlDocument doc = new XmlDocument();
+				doc.Load( rdr );
+
+				string extension = Path.GetExtension( projectPath );
+				string assemblyName = null;
+
+				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" ) )
+						{
+							string name = RequiredAttributeValue( configNode, "Name" );
+							int config_type = System.Convert.ToInt32(RequiredAttributeValue(configNode, "ConfigurationType" ) );
+							string dirName = name;
+							int bar = dirName.IndexOf( '|' );
+							if ( bar >= 0 )
+								dirName = dirName.Substring( 0, bar );
+							string outputPath = RequiredAttributeValue( configNode, "OutputDirectory" );
+							outputPath = outputPath.Replace( "$(SolutionDir)", Path.GetFullPath( Path.GetDirectoryName( projectPath ) ) + Path.DirectorySeparatorChar );
+							outputPath = outputPath.Replace( "$(ConfigToCreate)", dirName );
+
+							string outputDirectory = Path.Combine( projectDirectory, outputPath );
+							XmlNode toolNode = configNode.SelectSingleNode( "Tool[@Name='VCLinkerTool']" );
+							if ( toolNode != null )
+							{
+								assemblyName = SafeAttributeValue( toolNode, "OutputFile" );
+								if ( assemblyName != null )
+									assemblyName = Path.GetFileName( assemblyName );
+								else
+									assemblyName = Path.GetFileNameWithoutExtension(projectPath) + extensions[config_type];
+							}
+							else
+							{
+								toolNode = configNode.SelectSingleNode( "Tool[@Name='VCNMakeTool']" );
+								if ( toolNode != null )
+									assemblyName = Path.GetFileName( RequiredAttributeValue( toolNode, "Output" ) );
+							}
+
+							assemblyName = assemblyName.Replace( "$(OutDir)", outputPath );
+							assemblyName = assemblyName.Replace( "$(ProjectName)", this.Name );
+
+							VSProjectConfig config = new VSProjectConfig ( name );
+							if ( assemblyName != null )
+								config.Assemblies.Add( Path.Combine( outputDirectory, assemblyName ) );
+							
+							this.configs.Add( config );
+						}
+					
+						break;
+
+					case ".csproj":
+					case ".vbproj":
+					case ".vjsproj":
+						LoadProject( projectDirectory, doc );
+						break;
+
+					default:
+						break;
+				}
+			}
+			catch( FileNotFoundException )
+			{
+				throw;
+			}
+			catch( Exception e )
+			{
+				ThrowInvalidFormat( projectPath, e );
+			}
+			finally
+			{
+				rdr.Close();
+			}
+		}
+
+		private bool LoadProject(string projectDirectory, XmlDocument doc)
+		{
+			bool loaded = LoadVS2003Project(projectDirectory, doc);
+			if (loaded) return true;
+
+			loaded = LoadMSBuildProject(projectDirectory, doc);
+			if (loaded) return true;
+
+			return false;
+		}
+
+		private bool LoadVS2003Project(string projectDirectory, XmlDocument doc)
+		{
+			XmlNode settingsNode = doc.SelectSingleNode("/VisualStudioProject/*/Build/Settings");
+			if (settingsNode == null)
+				return false;
+
+			string assemblyName = RequiredAttributeValue( settingsNode, "AssemblyName" );
+			string outputType = RequiredAttributeValue( settingsNode, "OutputType" );
+
+			if (outputType == "Exe" || outputType == "WinExe")
+				assemblyName = assemblyName + ".exe";
+			else
+				assemblyName = assemblyName + ".dll";
+
+			XmlNodeList nodes = settingsNode.SelectNodes("Config");
+			if (nodes != null)
+				foreach (XmlNode configNode in nodes)
+				{
+					string name = RequiredAttributeValue( configNode, "Name" );
+					string outputPath = RequiredAttributeValue( configNode, "OutputPath" );
+					string outputDirectory = Path.Combine(projectDirectory, outputPath);
+					string assemblyPath = Path.Combine(outputDirectory, assemblyName);
+
+					VSProjectConfig config = new VSProjectConfig(name);
+					config.Assemblies.Add(assemblyPath);
+
+					configs.Add(config);
+				}
+
+			return true;
+		}
+
+		private bool LoadMSBuildProject(string projectDirectory, XmlDocument doc)
+		{
+			XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable);
+			namespaceManager.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003");
+
+			XmlNodeList nodes = doc.SelectNodes("/msbuild:Project/msbuild:PropertyGroup", namespaceManager);
+			if (nodes == null) return false;
+
+			XmlElement assemblyNameElement = (XmlElement)doc.SelectSingleNode("/msbuild:Project/msbuild:PropertyGroup/msbuild:AssemblyName", namespaceManager);
+			string assemblyName = assemblyNameElement.InnerText;
+
+			XmlElement outputTypeElement = (XmlElement)doc.SelectSingleNode("/msbuild:Project/msbuild:PropertyGroup/msbuild:OutputType", namespaceManager);
+			string outputType = outputTypeElement.InnerText;
+
+			if (outputType == "Exe" || outputType == "WinExe")
+				assemblyName = assemblyName + ".exe";
+			else
+				assemblyName = assemblyName + ".dll";
+
+			foreach (XmlElement configNode in nodes)
+			{
+                if (configNode.Name != "PropertyGroup")
+                    continue;
+
+				XmlAttribute conditionAttribute = configNode.Attributes["Condition"];
+				if (conditionAttribute == null) continue;
+
+				string condition = conditionAttribute.Value;
+				int start = condition.IndexOf( "==" );
+				if ( start < 0 ) continue;
+
+				string configurationName = condition.Substring( start + 2 ).Trim(new char[] {' ', '\'' } );
+				if ( configurationName.EndsWith( "|AnyCPU" ) )
+					configurationName = configurationName.Substring( 0, configurationName.Length - 7 );
+
+				XmlElement outputPathElement = (XmlElement)configNode.SelectSingleNode("msbuild:OutputPath", namespaceManager);
+				string outputPath = outputPathElement.InnerText;
+
+				string outputDirectory = Path.Combine(projectDirectory, outputPath);
+				string assemblyPath = Path.Combine(outputDirectory, assemblyName);
+
+				VSProjectConfig config = new VSProjectConfig(configurationName);
+				config.Assemblies.Add(assemblyPath);
+
+				configs.Add(config);
+			}
+
+			return true;
+		}
+
+		private void ThrowInvalidFileType(string projectPath)
+		{
+			throw new ArgumentException( 
+				string.Format( "Invalid model file type: {0}", 
+								Path.GetFileName( projectPath ) ) );
+		}
+
+		private void ThrowInvalidFormat( string projectPath, Exception e )
+		{
+			throw new ArgumentException( 
+				string.Format( "Invalid model file format: {0}", 
+								Path.GetFileName( projectPath ) ), e );
+		}
+
+		private string SafeAttributeValue( XmlNode node, string attrName )
+		{
+			XmlNode attrNode = node.Attributes[attrName];
+			return attrNode == null ? null : attrNode.Value;
+		}
+
+		private string RequiredAttributeValue( XmlNode node, string name )
+		{
+			string result = SafeAttributeValue( node, name );
+			if ( result != null )
+				return result;
+
+			throw new ApplicationException( "Missing required attribute " + name );
+		}
+		#endregion
+	}
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/VSProjectConfig.cs b/src/ProjectEditor/editor/PropertyEditor/VSProjectConfig.cs
new file mode 100644
index 0000000..ba70662
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/VSProjectConfig.cs
@@ -0,0 +1,39 @@
+// ****************************************************************
+// 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.Specialized;
+
+namespace NUnit.ProjectEditor
+{
+	/// <summary>
+	/// Originally, we used the same ProjectConfig class for both
+	/// NUnit and Visual Studio projects. Since we really do very
+	/// little with VS Projects, this class has been created to 
+	/// hold the name and the collection of assembly paths.
+	/// </summary>
+	public class VSProjectConfig
+	{
+		private string name;
+		
+		private StringCollection assemblies = new StringCollection();
+
+		public VSProjectConfig( string name )
+		{
+			this.name = name;
+		}
+
+		public string Name
+		{
+			get { return name; }
+		}
+
+		public StringCollection Assemblies
+		{
+			get { return assemblies; }
+		}
+	}
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/VSProjectConfigCollection.cs b/src/ProjectEditor/editor/PropertyEditor/VSProjectConfigCollection.cs
new file mode 100644
index 0000000..ef6547b
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/VSProjectConfigCollection.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// 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.ProjectEditor
+{
+	/// <summary>
+	/// A simple collection to hold VSProjectConfigs. Originally,
+	/// we used the (NUnit) ProjectConfigCollection, but the
+	/// classes have since diverged.
+	/// </summary>
+	public class VSProjectConfigCollection : CollectionBase
+	{
+		public VSProjectConfig this[int index]
+		{
+			get { return List[index] as VSProjectConfig; }
+		}
+
+		public VSProjectConfig this[string name]
+		{
+			get
+			{
+				foreach ( VSProjectConfig config in InnerList )
+					if ( config.Name == name ) return config;
+
+				return null;
+			}
+		}
+
+		public void Add( VSProjectConfig config )
+		{
+			List.Add( config );
+		}
+
+		public bool Contains( string name )
+		{
+			foreach( VSProjectConfig config in InnerList )
+				if ( config.Name == name ) return true;
+
+			return false;
+		}
+	}
+}
diff --git a/src/ProjectEditor/editor/PropertyEditor/XmlHelper.cs b/src/ProjectEditor/editor/PropertyEditor/XmlHelper.cs
new file mode 100644
index 0000000..02d0385
--- /dev/null
+++ b/src/ProjectEditor/editor/PropertyEditor/XmlHelper.cs
@@ -0,0 +1,118 @@
+// ****************************************************************
+// 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.Generic;
+using System.Xml;
+
+namespace NUnit.ProjectEditor
+{
+    public class XmlHelper
+    {
+        #region Attributes
+
+        public static string GetAttribute(XmlNode node, string name)
+        {
+            XmlAttribute attr = node.Attributes[name];
+            return attr == null ? null : attr.Value;
+        }
+
+        public static T GetAttributeAsEnum<T>(XmlNode node, string name, T defaultValue)
+        {
+            string attrVal = XmlHelper.GetAttribute(node, name);
+            if (attrVal == null)
+                return defaultValue;
+
+            if (typeof(T).IsEnum)
+            {
+                foreach (string s in Enum.GetNames(typeof(T)))
+                    if (s.Equals(attrVal, StringComparison.OrdinalIgnoreCase))
+                        return (T)Enum.Parse(typeof(T), attrVal, true);
+            }
+
+            throw new XmlException(
+                string.Format("Invalid attribute value: {0}", node.Attributes[name].OuterXml));
+        }
+
+        /// <summary>
+        /// Adds an attribute with a specified name and value to an existing XmlNode.
+        /// </summary>
+        /// <param name="node">The node to which the attribute should be added.</param>
+        /// <param name="name">The name of the attribute.</param>
+        /// <param name="value">The value of the attribute.</param>
+        public static void AddAttribute(XmlNode node, string name, string value)
+        {
+            XmlAttribute attr = node.OwnerDocument.CreateAttribute(name);
+            attr.Value = value;
+            node.Attributes.Append(attr);
+        }
+
+        public static void RemoveAttribute(XmlNode node, string name)
+        {
+            XmlAttribute attr = node.Attributes[name];
+            if (attr != null)
+                node.Attributes.Remove(attr);
+        }
+
+        public static void SetAttribute(XmlNode node, string name, object value)
+        {
+            bool attrAdded = false;
+
+            XmlAttribute attr = node.Attributes[name];
+            if (attr == null)
+            {
+                attr = node.OwnerDocument.CreateAttribute(name);
+                node.Attributes.Append(attr);
+                attrAdded = true;
+            }
+
+            string valString = value.ToString();
+            if (attrAdded || attr.Value != valString)
+                attr.Value = valString;
+        }
+        
+        #endregion
+
+        #region Elements
+
+        /// <summary>
+        /// Adds a new element as a child of an existing XmlNode and returns it.
+        /// </summary>
+        /// <param name="node">The node to which the element should be added.</param>
+        /// <param name="name">The element name.</param>
+        /// <returns>The newly created child element</returns>
+        public static XmlNode AddElement(XmlNode node, string name)
+        {
+            XmlNode childNode = node.OwnerDocument.CreateElement(name);
+            node.AppendChild(childNode);
+            return childNode;
+        }
+
+        /// <summary>
+        /// Inserts a new element as a child of an existing XmlNode and returns it.
+        /// </summary>
+        /// <param name="node">The node to which the element should be inserted as a child.</param>
+        /// <param name="name">The element name.</param>
+        /// <param name="index">The index at which the element should be inserted.</param>
+        /// <returns>The newly created child element</returns>
+        public static XmlNode InsertElement(XmlNode node, string name, int index)
+        {
+            XmlNode childNode = node.OwnerDocument.CreateElement(name);
+            int childCount = node.ChildNodes.Count;
+
+            if (index < 0 || index > childCount)
+                throw new ArgumentOutOfRangeException("index");
+
+            if (index == node.ChildNodes.Count)
+                node.AppendChild(childNode);
+            else
+                node.InsertBefore(childNode, node.ChildNodes[index]);
+
+            return childNode;
+        }
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ButtonElement.cs b/src/ProjectEditor/editor/ViewElements/ButtonElement.cs
new file mode 100644
index 0000000..ef8c2ee
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ButtonElement.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    /// <summary>
+    /// ControlWrapper is a general wrapper for controls used
+    /// by the view. It implements several different interfaces
+    /// so that the view may choose which one to expose, based
+    /// on the type of textBox and how it is used.
+    /// </summary>
+    public class ButtonElement : ControlElement, ICommand
+    {
+        public ButtonElement(Button button) : base(button)
+        {
+            button.Click += delegate
+            {
+                if (Execute != null)
+                    Execute();
+            };
+        }
+
+        public event CommandDelegate Execute;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ComboBoxElement.cs b/src/ProjectEditor/editor/ViewElements/ComboBoxElement.cs
new file mode 100644
index 0000000..01d7fd8
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ComboBoxElement.cs
@@ -0,0 +1,93 @@
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// ComboBoxElement is used to wrap a ComboBox. If the
+    /// text is editable by the user, the view should expose
+    /// the element using the IComboBox interface. Otherwise,
+    /// the ISelectionInterface provides all the needed
+    /// functionality.
+    /// </summary>
+    public class ComboBoxElement : ControlElement, ISelectionList, IComboBox
+    {
+        private ComboBox comboBox;
+
+        public ComboBoxElement(ComboBox comboBox)
+            : base(comboBox)
+        {
+            this.comboBox = comboBox;
+
+            comboBox.SelectedIndexChanged += delegate
+            {
+                if (SelectionChanged != null)
+                    SelectionChanged();
+            };
+
+            comboBox.Validated += delegate
+            {
+                if (TextValidated != null)
+                    TextValidated();
+            };
+        }
+
+        /// <summary>
+        /// Gets or sets the SelectedIndex property of the associated ComboBox
+        /// </summary>
+        public int SelectedIndex
+        {
+            get { return comboBox.SelectedIndex; }
+            set { comboBox.SelectedIndex = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the SelectedItem property of the associated ComboBox
+        /// </summary>
+        public string SelectedItem
+        {
+            get { return (string)comboBox.SelectedItem; }
+            set { comboBox.SelectedItem = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the list of items displayed in the associated ComboBox
+        /// </summary>
+        public string[] SelectionList
+        {
+            get
+            {
+                string[] list = new string[comboBox.Items.Count];
+                    
+                int index = 0;
+                foreach (string item in comboBox.Items)
+                    list[index++] = item;
+
+                return list;
+            }
+            set
+            {
+                comboBox.Items.Clear();
+                foreach (string item in value)
+                    comboBox.Items.Add(item);
+            }
+        }
+
+        /// <summary>
+        /// Event raised when the selection in the associated ComboBox changes
+        /// </summary>
+        public event ActionDelegate SelectionChanged;
+
+        /// <summary>
+        /// Event raised when the Text of the associated ComboBox is validated
+        /// </summary>
+        public event ActionDelegate TextValidated;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ControlElement.cs b/src/ProjectEditor/editor/ViewElements/ControlElement.cs
new file mode 100644
index 0000000..3685fef
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ControlElement.cs
@@ -0,0 +1,50 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    /// <summary>
+    /// ControlWrapper is a general wrapper for controls used
+    /// by the view. It implements several different interfaces
+    /// so that the view may choose which one to expose, based
+    /// on the type of textBox and how it is used.
+    /// </summary>
+    public class ControlElement : IViewElement
+    {
+        private Control control;
+
+        public ControlElement(Control control)
+        {
+            this.control = control;
+        }
+       
+        public string Name
+        {
+            get { return control.Name; }
+        }
+
+        public bool Enabled
+        {
+            get { return control.Enabled; }
+            set { control.Enabled = value; }
+        }
+
+        public bool Visible
+        {
+            get { return control.Visible; }
+            set { control.Visible = value; }
+        }
+
+        public string Text
+        {
+            get { return control.Text; }
+            set { control.Text = value; }
+        }
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/DialogManager.cs b/src/ProjectEditor/editor/ViewElements/DialogManager.cs
new file mode 100644
index 0000000..e551242
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/DialogManager.cs
@@ -0,0 +1,70 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public class DialogManager : IDialogManager
+    {
+        string caption;
+
+        #region Constructor
+
+        public DialogManager(string defaultCaption)
+        {
+            this.caption = defaultCaption;
+        }
+
+        #endregion
+
+        #region IDialogManager Members
+
+        public string GetFileOpenPath(string title, string filter, string initialDirectory)
+        {
+            OpenFileDialog dlg = new OpenFileDialog();
+
+            dlg.Title = title;
+            dlg.Filter = filter;
+            if (initialDirectory != null)
+                dlg.InitialDirectory = initialDirectory;
+            dlg.FilterIndex = 1;
+            dlg.FileName = "";
+            dlg.Multiselect = false;
+
+            return dlg.ShowDialog() == DialogResult.OK
+                ? dlg.FileNames[0]
+                : null;
+        }
+
+        public string GetSaveAsPath(string title, string filter)
+        {
+            SaveFileDialog dlg = new SaveFileDialog();
+
+            dlg.Title = title;
+            dlg.Filter = filter;
+            dlg.FilterIndex = 1;
+            dlg.FileName = "";
+
+            return dlg.ShowDialog() == DialogResult.OK
+                ? dlg.FileName
+                : null;
+        }
+
+        public string GetFolderPath(string message, string initialPath)
+        {
+            FolderBrowserDialog browser = new FolderBrowserDialog();
+            browser.Description = message;
+            browser.SelectedPath = initialPath;
+            return browser.ShowDialog() == DialogResult.OK
+                ? browser.SelectedPath
+                : null;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/IComboBox.cs b/src/ProjectEditor/editor/ViewElements/IComboBox.cs
new file mode 100644
index 0000000..89806f9
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/IComboBox.cs
@@ -0,0 +1,33 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    /// <summary>
+    /// IComboBox is implemented by view elements that associate
+    /// an editable TextBox with a SelectionList. The classic
+    /// implementation is System.Windows.Forms.ComboBox. This 
+    /// interface is only intended for use when the TextBox
+    /// is editable. Otherwise, ISelectionList provides all
+    /// the necessary functionality.
+    /// </summary>
+    public interface IComboBox : ISelectionList
+    {
+        /// <summary>
+        /// Gets or sets the value of the TextBox associated
+        /// with this ComboBox.
+        /// </summary>
+        string Text { get; set; }
+
+        /// <summary>
+        /// Event that is raised when the text has changed
+        /// and the focus is moved away.
+        /// </summary>
+        event ActionDelegate TextValidated;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ICommand.cs b/src/ProjectEditor/editor/ViewElements/ICommand.cs
new file mode 100644
index 0000000..981456c
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ICommand.cs
@@ -0,0 +1,20 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public interface ICommand : IViewElement
+    {
+        /// <summary>
+        /// Execute event is raised to signal the presenter
+        /// to execute the command with which this menu
+        /// item is associated.
+        /// </summary>
+        event CommandDelegate Execute;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/IDialogManager.cs b/src/ProjectEditor/editor/ViewElements/IDialogManager.cs
new file mode 100644
index 0000000..e6ce471
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/IDialogManager.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public interface IDialogManager
+    {
+        string GetFileOpenPath(string title, string filter, string initialDirectory);
+
+        string GetSaveAsPath(string title, string filter);
+
+        string GetFolderPath(string message, string initialPath);
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/IMessageDisplay.cs b/src/ProjectEditor/editor/ViewElements/IMessageDisplay.cs
new file mode 100644
index 0000000..a51f455
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/IMessageDisplay.cs
@@ -0,0 +1,18 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public interface IMessageDisplay
+    {
+        void Error(string message);
+
+        bool AskYesNoQuestion(string question);
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ISelection.cs b/src/ProjectEditor/editor/ViewElements/ISelection.cs
new file mode 100644
index 0000000..6a4e42f
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ISelection.cs
@@ -0,0 +1,23 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public interface ISelection : IViewElement
+    {
+        /// <summary>
+        /// Gets or sets the index of the currently selected item
+        /// </summary>
+        int SelectedIndex { get; set; }
+
+        /// <summary>
+        /// Event raised when the selection is changed by the user
+        /// </summary>
+        event ActionDelegate SelectionChanged;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ISelectionList.cs b/src/ProjectEditor/editor/ViewElements/ISelectionList.cs
new file mode 100644
index 0000000..591d172
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ISelectionList.cs
@@ -0,0 +1,28 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    /// <summary>
+    /// The ISelectionList interface represents
+    /// a ui element that allows the user to select one of
+    /// a set of items.
+    /// </summary>
+    public interface ISelectionList : ISelection
+    {
+        /// <summary>
+        /// Gets or sets the currently selected item
+        /// </summary>
+        string SelectedItem { get; set; }
+
+        /// <summary>
+        /// Gets or sets the contents of the selection list
+        /// </summary>
+        string[] SelectionList { get; set; }
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ITextElement.cs b/src/ProjectEditor/editor/ViewElements/ITextElement.cs
new file mode 100644
index 0000000..3b482a6
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ITextElement.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public interface ITextElement : IViewElement
+    {
+        /// <summary>
+        /// Gets or sets the text of the element
+        /// </summary>
+        string Text { get; set; }
+
+        void Select(int offset, int length);
+
+        /// <summary>
+        /// Changed event is raised whenever the text changes
+        /// </summary>
+        event ActionDelegate Changed;
+        
+        /// <summary>
+        /// Validated event is raised when the text has been
+        /// changed and focus has left the UI element.
+        /// </summary>
+        event ActionDelegate Validated;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/IViewElement.cs b/src/ProjectEditor/editor/ViewElements/IViewElement.cs
new file mode 100644
index 0000000..fbfa5f8
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/IViewElement.cs
@@ -0,0 +1,28 @@
+// ****************************************************************
+// 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;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// The IViewElement interface is exposed by the view
+    /// for an individual gui element. It is the base of
+    /// other more specific interfaces.
+    /// </summary>
+    public interface IViewElement
+    {
+        /// <summary>
+        /// Gets the name of the element in the view
+        /// </summary>
+        string Name { get; }
+
+        /// <summary>
+        /// Gets or sets the enabled status of the element
+        /// </summary>
+        bool Enabled { get; set; }
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/ListBoxElement.cs b/src/ProjectEditor/editor/ViewElements/ListBoxElement.cs
new file mode 100644
index 0000000..5e73df2
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/ListBoxElement.cs
@@ -0,0 +1,62 @@
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public class ListBoxElement : ControlElement, ISelectionList
+    {
+        private ListBox listBox;
+
+        public ListBoxElement(ListBox listBox)
+            : base(listBox)
+        {
+            this.listBox = listBox;
+
+            listBox.SelectedIndexChanged += delegate
+            {
+                if (SelectionChanged != null)
+                    SelectionChanged();
+            };
+        }
+
+        public int SelectedIndex
+        {
+            get { return listBox.SelectedIndex; }
+            set { listBox.SelectedIndex = value; }
+        }
+
+        public string SelectedItem
+        {
+            get { return (string)listBox.SelectedItem; }
+            set { listBox.SelectedItem = value; }
+        }
+
+        public string[] SelectionList
+        {
+            get
+            {
+                string[] list = new string[listBox.Items.Count];
+                int index = 0;
+                foreach (string item in listBox.Items)
+                    list[index++] = item;
+
+                return list;
+            }
+            set
+            {
+                listBox.Items.Clear();
+                foreach (string item in value)
+                    listBox.Items.Add(item);
+            }
+        }
+
+        public event ActionDelegate SelectionChanged;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/MenuElement.cs b/src/ProjectEditor/editor/ViewElements/MenuElement.cs
new file mode 100644
index 0000000..239ac73
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/MenuElement.cs
@@ -0,0 +1,47 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    /// <summary>
+    /// MenuItemWrapper is the implementation of MenuItem 
+    /// used in the actual application.
+    /// </summary>
+    public class MenuElement : ICommand
+    {
+        private ToolStripMenuItem menuItem;
+
+        public MenuElement(ToolStripMenuItem menuItem)
+        {
+            this.menuItem = menuItem;
+
+            menuItem.Click += delegate 
+                { if (Execute != null) Execute(); };
+        }
+
+        public event CommandDelegate Execute;
+
+        public string Name
+        {
+            get { return menuItem.Name; }
+        }
+
+        public bool Enabled
+        {
+            get { return menuItem.Enabled; }
+            set { menuItem.Enabled = value; }
+        }
+
+        public string Text
+        {
+            get { return menuItem.Text; }
+            set { menuItem.Text = value; }
+        }
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/MessageDisplay.cs b/src/ProjectEditor/editor/ViewElements/MessageDisplay.cs
new file mode 100644
index 0000000..89eef78
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/MessageDisplay.cs
@@ -0,0 +1,31 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public class MessageDisplay : IMessageDisplay
+    {
+        private string caption;
+
+        public MessageDisplay(string caption)
+        {
+            this.caption = caption;
+        }
+
+        public void Error(string message)
+        {
+            MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
+
+        public bool AskYesNoQuestion(string question)
+        {
+            return MessageBox.Show(question, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/ViewElements/RadioButtonGroup.cs b/src/ProjectEditor/editor/ViewElements/RadioButtonGroup.cs
new file mode 100644
index 0000000..ec394c0
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/RadioButtonGroup.cs
@@ -0,0 +1,71 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public class RadioButtonGroup : ISelection
+    {
+        private string name;
+        private bool enabled;
+        private RadioButton[] buttons;
+
+        public RadioButtonGroup(string name, params RadioButton[] buttons)
+        {
+            this.name = name;
+            this.enabled = buttons.Length > 0 ? buttons[0].Enabled : false;
+            this.buttons = buttons;
+
+            foreach (RadioButton button in buttons)
+                button.CheckedChanged += delegate
+                {
+                    if (SelectionChanged != null)
+                        SelectionChanged();
+                };
+        }
+
+        public string Name
+        {
+            get { return name; }
+        }
+
+        public bool Enabled
+        {
+            get 
+            {
+                return enabled;
+            }
+            set
+            {
+                enabled = value;
+
+                foreach (RadioButton button in buttons)
+                    button.Enabled = enabled;
+            }
+        }
+
+        public int SelectedIndex
+        {
+            get
+            {
+                for (int index = 0; index < buttons.Length; index++)
+                    if (buttons[index].Checked)
+                        return index;
+
+                return -1;
+            }
+            set 
+            { 
+                if (value >= 0 && value < buttons.Length)
+                    buttons[value].Checked = true; 
+            }
+        }
+
+        public event ActionDelegate SelectionChanged;
+    }
+}
diff --git a/src/ProjectEditor/editor/ViewElements/TextElement.cs b/src/ProjectEditor/editor/ViewElements/TextElement.cs
new file mode 100644
index 0000000..94e0066
--- /dev/null
+++ b/src/ProjectEditor/editor/ViewElements/TextElement.cs
@@ -0,0 +1,47 @@
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace NUnit.ProjectEditor.ViewElements
+{
+    public class TextElement : ControlElement, ITextElement
+    {
+        private TextBoxBase textBox;
+
+        public TextElement(Label label) : base(label) { }
+
+        public TextElement(TextBoxBase textBox) : base(textBox)
+        {
+            this.textBox = textBox;
+
+            textBox.TextChanged += delegate
+            {
+                if (Changed != null)
+                    Changed();
+            };
+
+            textBox.Validated += delegate
+            {
+                if (Validated != null)
+                    Validated();
+            };
+        }
+
+        public void Select(int offset, int length)
+        {
+            if (textBox == null)
+                throw new InvalidOperationException("Cannot select text in a label");
+
+            textBox.Select(offset, length);
+        }
+
+        public event ActionDelegate Changed;
+
+        public event ActionDelegate Validated;
+    }
+}
diff --git a/src/ProjectEditor/editor/XmlEditor/IXmlView.cs b/src/ProjectEditor/editor/XmlEditor/IXmlView.cs
new file mode 100644
index 0000000..64bc3a1
--- /dev/null
+++ b/src/ProjectEditor/editor/XmlEditor/IXmlView.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// 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.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    /// <summary>
+    /// IXmlView is the interface implemented by the XmlView
+    /// and consumed by the XmlPresenter.
+    /// </summary>
+    public interface IXmlView : IView
+    {
+        /// <summary>
+        /// Gets or sets the XML text
+        /// </summary>
+        ITextElement Xml { get; }
+
+        /// <summary>
+        /// Display an error message at bottom of the view,
+        /// adjusting the text to make edit box to make room.
+        /// </summary>
+        /// <param name="message">The message to display</param>
+        void DisplayError(string message);
+
+        /// <summary>
+        /// Display an error message at bottom of the view,
+        /// adjusting the text to make edit box to make room
+        /// and highlighting the text that caused the error.
+        /// </summary>
+        /// <param name="message">The message to display</param>
+        /// <param name="lineNumber">The line number in which the error occured.</param>
+        /// <param name="linePosition">The position in the line that caused the error.</param>
+        void DisplayError(string message, int lineNumber, int linePosition);
+
+        /// <summary>
+        /// Remove any error message from the view, adjusting
+        /// the edit box so it uses all the space.
+        /// </summary>
+        void RemoveError();
+
+        
+    }
+}
diff --git a/src/ProjectEditor/editor/XmlEditor/XmlPresenter.cs b/src/ProjectEditor/editor/XmlEditor/XmlPresenter.cs
new file mode 100644
index 0000000..47b56a6
--- /dev/null
+++ b/src/ProjectEditor/editor/XmlEditor/XmlPresenter.cs
@@ -0,0 +1,85 @@
+// ****************************************************************
+// 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.Xml;
+
+namespace NUnit.ProjectEditor
+{
+    public class XmlPresenter
+    {
+        private IProjectDocument doc;
+        private IXmlView view;
+
+        public XmlPresenter(IProjectDocument doc, IXmlView view)
+        {
+            this.doc = doc;
+            this.view = view;
+
+            view.Xml.Validated += delegate
+            {
+                UpdateModelFromView();
+
+                if (!doc.IsValid)
+                {
+                    XmlException ex = doc.Exception as XmlException;
+                    if (ex != null)
+                        view.DisplayError(ex.Message, ex.LineNumber, ex.LinePosition);
+                    else
+                        view.DisplayError(doc.Exception.Message);
+                }
+            };
+
+            doc.ProjectCreated += delegate
+            {
+                view.Visible = true;
+                LoadViewFromModel();
+            };
+
+            doc.ProjectClosed += delegate
+            {
+                view.Xml.Text = null;
+                view.Visible = false;
+            };
+        }
+
+        public void LoadViewFromModel()
+        {
+            view.Xml.Text = doc.XmlText;
+
+            if (doc.Exception != null)
+            {
+                XmlException ex = doc.Exception as XmlException;
+                if (ex != null)
+                    view.DisplayError(ex.Message, ex.LineNumber, ex.LinePosition);
+                else
+                    view.DisplayError(doc.Exception.Message);
+            }
+            else
+                view.RemoveError();
+        }
+
+        private int GetOffset(int lineNumber, int charPosition)
+        {
+            int offset = 0;
+
+            for (int lineCount = 1; lineCount < lineNumber; lineCount++ )
+            {
+                int next = doc.XmlText.IndexOf(Environment.NewLine, offset);
+                if (next < 0) break;
+
+                offset = next + Environment.NewLine.Length;
+            }
+
+            return offset - lineNumber + charPosition;
+        }
+
+        public void UpdateModelFromView()
+        {
+            doc.XmlText = view.Xml.Text;
+        }
+    }
+}
diff --git a/src/ProjectEditor/editor/XmlEditor/XmlView.Designer.cs b/src/ProjectEditor/editor/XmlEditor/XmlView.Designer.cs
new file mode 100644
index 0000000..b7e45fc
--- /dev/null
+++ b/src/ProjectEditor/editor/XmlEditor/XmlView.Designer.cs
@@ -0,0 +1,79 @@
+namespace NUnit.ProjectEditor
+{
+    partial class XmlView
+    {
+        /// <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 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.richTextBox1 = new System.Windows.Forms.RichTextBox();
+            this.errorMessageLabel = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // richTextBox1
+            // 
+            this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.richTextBox1.Font = new System.Drawing.Font("Courier New", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.richTextBox1.HideSelection = false;
+            this.richTextBox1.Location = new System.Drawing.Point(0, 0);
+            this.richTextBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+            this.richTextBox1.Name = "richTextBox1";
+            this.richTextBox1.Size = new System.Drawing.Size(346, 227);
+            this.richTextBox1.TabIndex = 0;
+            this.richTextBox1.Text = "";
+            this.richTextBox1.WordWrap = false;
+            // 
+            // errorMessageLabel
+            // 
+            this.errorMessageLabel.BackColor = System.Drawing.SystemColors.Window;
+            this.errorMessageLabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.errorMessageLabel.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.errorMessageLabel.ForeColor = System.Drawing.Color.Red;
+            this.errorMessageLabel.Location = new System.Drawing.Point(0, 193);
+            this.errorMessageLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.errorMessageLabel.Name = "errorMessageLabel";
+            this.errorMessageLabel.Size = new System.Drawing.Size(346, 34);
+            this.errorMessageLabel.TabIndex = 1;
+            this.errorMessageLabel.Text = "label1";
+            // 
+            // XmlView
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.errorMessageLabel);
+            this.Controls.Add(this.richTextBox1);
+            this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+            this.Name = "XmlView";
+            this.Size = new System.Drawing.Size(346, 227);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.RichTextBox richTextBox1;
+        private System.Windows.Forms.Label errorMessageLabel;
+    }
+}
diff --git a/src/ProjectEditor/editor/XmlEditor/XmlView.cs b/src/ProjectEditor/editor/XmlEditor/XmlView.cs
new file mode 100644
index 0000000..9f8d401
--- /dev/null
+++ b/src/ProjectEditor/editor/XmlEditor/XmlView.cs
@@ -0,0 +1,100 @@
+// ****************************************************************
+// 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.ComponentModel;
+using System.Windows.Forms;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor
+{
+    public partial class XmlView : UserControl, IXmlView
+    {
+        #region Instance Variables
+
+        private ITextElement xml;
+        private IMessageDisplay messageDisplay;
+
+        #endregion
+
+        #region Constructor
+
+        /// <summary>
+        /// Constructor
+        /// </summary>
+        public XmlView()
+        {
+            InitializeComponent();
+
+            xml = new TextElement(richTextBox1);
+            messageDisplay = new MessageDisplay("NUnit Project Editor");
+        }
+
+        #endregion
+
+        #region IXmlView Members
+
+        /// <summary>
+        /// Gets or sets the XML text
+        /// </summary>
+        public ITextElement Xml 
+        {
+            get { return xml; }
+        }
+
+        public void DisplayError(string message)
+        {
+            errorMessageLabel.Visible = true;
+            errorMessageLabel.Text = message;
+
+            richTextBox1.Dock = DockStyle.Top;
+            richTextBox1.Height = this.ClientSize.Height - errorMessageLabel.Height;
+        }
+
+        public void DisplayError(string message, int lineNumber, int linePosition)
+        {
+            DisplayError(message);
+
+            if (lineNumber > 0 && linePosition > 0)
+            {
+                int offset = richTextBox1.GetFirstCharIndexFromLine(lineNumber - 1) + linePosition - 1;
+                int length = 0;
+
+                string text = richTextBox1.Text;
+                if (char.IsLetterOrDigit(text[offset]))
+                    while (char.IsLetterOrDigit(text[offset + length]))
+                        length++;
+                else
+                    length = 1;
+
+                richTextBox1.Select(offset, length);
+            }
+        }
+
+        public void RemoveError()
+        {
+            errorMessageLabel.Visible = false;
+            richTextBox1.Dock = DockStyle.Fill;
+        }
+
+        public IMessageDisplay MessageDisplay 
+        {
+            get { return messageDisplay; }
+        }
+
+        #endregion
+
+        #region Event Handlers
+
+        //private void richTextBox1_Validated(object sender, EventArgs e)
+        //{
+        //    if (XmlChanged != null)
+        //        XmlChanged();
+        //}
+
+        #endregion
+    }
+}
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.resx b/src/ProjectEditor/editor/XmlEditor/XmlView.resx
similarity index 100%
copy from src/GuiComponents/UiKit/TestPropertiesDialog.resx
copy to src/ProjectEditor/editor/XmlEditor/XmlView.resx
diff --git a/src/ProjectEditor/editor/nunit-editor.build b/src/ProjectEditor/editor/nunit-editor.build
new file mode 100644
index 0000000..e07b74e
--- /dev/null
+++ b/src/ProjectEditor/editor/nunit-editor.build
@@ -0,0 +1,108 @@
+<?xml version="1.0"?>
+<project name="NUnitEditor" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Properties/AssemblyInfo.cs"/>
+    <include name="AboutBox.cs"/>
+    <include name="AboutBox.Designer.cs"/>
+    <include name="Delegates.cs"/>
+    <include name="IDialog.cs"/>
+    <include name="IView.cs"/>
+    <include name="PathUtils.cs"/>
+    <include name="Program.cs"/>
+    <include name="ConfigurationEditor/AddConfigurationDialog.cs"/>
+    <include name="ConfigurationEditor/AddConfigurationDialog.Designer.cs"/>
+    <include name="ConfigurationEditor/AddConfigurationPresenter.cs"/>
+    <include name="ConfigurationEditor/ConfigurationEditor.cs"/>
+    <include name="ConfigurationEditor/ConfigurationEditorView.cs"/>
+    <include name="ConfigurationEditor/ConfigurationEditorView.Designer.cs"/>
+    <include name="ConfigurationEditor/IConfigurationEditorView.cs"/>
+    <include name="ConfigurationEditor/RenameConfigurationDialog.cs"/>
+    <include name="ConfigurationEditor/RenameConfigurationDialog.Designer.cs"/>
+    <include name="ConfigurationEditor/RenameConfigurationPresenter.cs"/>
+    <include name="Main/IMainView.cs"/>
+    <include name="Main/IProjectDocument.cs"/>
+    <include name="Main/MainForm.cs"/>
+    <include name="Main/MainForm.Designer.cs"/>
+    <include name="Main/MainPresenter.cs"/>
+    <include name="Main/ProjectDocument.cs"/>
+    <include name="PropertyEditor/AssemblyList.cs"/>
+    <include name="PropertyEditor/ConfigList.cs"/>
+    <include name="PropertyEditor/IProjectConfig.cs"/>
+    <include name="PropertyEditor/IProjectModel.cs"/>
+    <include name="PropertyEditor/IPropertyView.cs"/>
+    <include name="PropertyEditor/ProjectConfig.cs"/>
+    <include name="PropertyEditor/ProjectModel.cs"/>
+    <include name="PropertyEditor/PropertyPresenter.cs"/>
+    <include name="PropertyEditor/PropertyView.cs"/>
+    <include name="PropertyEditor/PropertyView.Designer.cs"/>
+    <include name="PropertyEditor/RuntimeFramework.cs"/>
+    <include name="PropertyEditor/VSProject.cs"/>
+    <include name="PropertyEditor/VSProjectConfig.cs"/>
+    <include name="PropertyEditor/VSProjectConfigCollection.cs"/>
+    <include name="PropertyEditor/XmlHelper.cs"/>
+    <include name="ViewElements/ButtonElement.cs"/>
+    <include name="ViewElements/ComboBoxElement.cs"/>
+    <include name="ViewElements/ControlElement.cs"/>
+    <include name="ViewElements/DialogManager.cs"/>
+    <include name="ViewElements/IComboBox.cs"/>
+    <include name="ViewElements/ICommand.cs"/>
+    <include name="ViewElements/IDialogManager.cs"/>
+    <include name="ViewElements/IMessageDisplay.cs"/>
+    <include name="ViewElements/ISelection.cs"/>
+    <include name="ViewElements/ISelectionList.cs"/>
+    <include name="ViewElements/ITextElement.cs"/>
+    <include name="ViewElements/IViewElement.cs"/>
+    <include name="ViewElements/ListBoxElement.cs"/>
+    <include name="ViewElements/MenuElement.cs"/>
+    <include name="ViewElements/MessageDisplay.cs"/>
+    <include name="ViewElements/RadioButtonGroup.cs"/>
+    <include name="ViewElements/TextElement.cs"/>
+    <include name="XmlEditor/IXmlView.cs"/>
+    <include name="XmlEditor/XmlPresenter.cs"/>
+    <include name="XmlEditor/XmlView.cs"/>
+    <include name="XmlEditor/XmlView.Designer.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="**/*.resx"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit-editor.exe" 
+        debug="${build.debug}"
+        define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <resources>
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="System.Xml.dll"/>
+      </references>
+    </csc>
+<!--
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/nunit-editor.config"/>
+ -->      
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/ProjectEditor/editor">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit-editor.csproj"/>
+        <include name="nunit-editor.build"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/nunit-editor.csproj b/src/ProjectEditor/editor/nunit-editor.csproj
new file mode 100644
index 0000000..dc70f01
--- /dev/null
+++ b/src/ProjectEditor/editor/nunit-editor.csproj
@@ -0,0 +1,172 @@
+<?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.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NUnit.ProjectEditor</RootNamespace>
+    <AssemblyName>nunit-editor</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AboutBox.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AboutBox.Designer.cs">
+      <DependentUpon>AboutBox.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConfigurationEditor\AddConfigurationDialog.Designer.cs">
+      <DependentUpon>AddConfigurationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConfigurationEditor\AddConfigurationPresenter.cs" />
+    <Compile Include="ConfigurationEditor\ConfigurationEditorView.Designer.cs">
+      <DependentUpon>ConfigurationEditorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConfigurationEditor\RenameConfigurationDialog.Designer.cs">
+      <DependentUpon>RenameConfigurationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConfigurationEditor\RenameConfigurationPresenter.cs" />
+    <Compile Include="Delegates.cs" />
+    <Compile Include="IDialog.cs" />
+    <Compile Include="IView.cs" />
+    <Compile Include="Main\IProjectDocument.cs" />
+    <Compile Include="Main\IMainView.cs" />
+    <Compile Include="Main\MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Main\MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Main\ProjectDocument.cs" />
+    <Compile Include="Main\MainPresenter.cs" />
+    <Compile Include="PropertyEditor\AssemblyList.cs" />
+    <Compile Include="PropertyEditor\ConfigList.cs" />
+    <Compile Include="PropertyEditor\IProjectConfig.cs" />
+    <Compile Include="PropertyEditor\ProjectConfig.cs" />
+    <Compile Include="PropertyEditor\ProjectModel.cs" />
+    <Compile Include="PropertyEditor\RuntimeFramework.cs" />
+    <Compile Include="PropertyEditor\VSProject.cs" />
+    <Compile Include="PropertyEditor\VSProjectConfig.cs" />
+    <Compile Include="PropertyEditor\VSProjectConfigCollection.cs" />
+    <Compile Include="PropertyEditor\XmlHelper.cs" />
+    <Compile Include="ViewElements\ButtonElement.cs" />
+    <Compile Include="ViewElements\ComboBoxElement.cs" />
+    <Compile Include="ViewElements\ControlElement.cs" />
+    <Compile Include="ViewElements\DialogManager.cs" />
+    <Compile Include="ViewElements\IComboBox.cs" />
+    <Compile Include="ViewElements\IDialogManager.cs" />
+    <Compile Include="ViewElements\IMessageDisplay.cs" />
+    <Compile Include="ViewElements\ISelection.cs" />
+    <Compile Include="ViewElements\ISelectionList.cs" />
+    <Compile Include="ViewElements\ITextElement.cs" />
+    <Compile Include="ViewElements\IViewElement.cs" />
+    <Compile Include="ViewElements\ListBoxElement.cs" />
+    <Compile Include="ViewElements\ICommand.cs" />
+    <Compile Include="ViewElements\MenuElement.cs" />
+    <Compile Include="ConfigurationEditor\AddConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ConfigurationEditor\ConfigurationEditor.cs" />
+    <Compile Include="ConfigurationEditor\ConfigurationEditorView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ConfigurationEditor\IConfigurationEditorView.cs" />
+    <Compile Include="ConfigurationEditor\RenameConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PropertyEditor\IProjectModel.cs" />
+    <Compile Include="PropertyEditor\IPropertyView.cs" />
+    <Compile Include="PropertyEditor\PropertyPresenter.cs" />
+    <Compile Include="PropertyEditor\PropertyView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PropertyEditor\PropertyView.Designer.cs">
+      <DependentUpon>PropertyView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PathUtils.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="AboutBox.resx">
+      <DependentUpon>AboutBox.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConfigurationEditor\AddConfigurationDialog.resx">
+      <DependentUpon>AddConfigurationDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConfigurationEditor\ConfigurationEditorView.resx">
+      <DependentUpon>ConfigurationEditorView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConfigurationEditor\RenameConfigurationDialog.resx">
+      <DependentUpon>RenameConfigurationDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Main\MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PropertyEditor\PropertyView.resx">
+      <DependentUpon>PropertyView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="XmlEditor\XmlView.resx">
+      <DependentUpon>XmlView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <None Include="nunit-editor.build" />
+    <Compile Include="ViewElements\MessageDisplay.cs" />
+    <Compile Include="ViewElements\RadioButtonGroup.cs" />
+    <Compile Include="ViewElements\TextElement.cs" />
+    <Compile Include="XmlEditor\IXmlView.cs" />
+    <Compile Include="XmlEditor\XmlPresenter.cs" />
+    <Compile Include="XmlEditor\XmlView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="XmlEditor\XmlView.Designer.cs">
+      <DependentUpon>XmlView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\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/ProjectEditor/tests/Model/AssemblyListTests.cs b/src/ProjectEditor/tests/Model/AssemblyListTests.cs
new file mode 100644
index 0000000..1d541f6
--- /dev/null
+++ b/src/ProjectEditor/tests/Model/AssemblyListTests.cs
@@ -0,0 +1,136 @@
+// ****************************************************************
+// 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.Xml;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Model
+{
+	/// <summary>
+	/// This fixture tests AssemblyList
+	/// </summary>
+	[TestFixture]
+	public class AssemblyListTests
+	{
+		private AssemblyList assemblies;
+
+        private string path1;
+        private string path2;
+        private string path3;
+
+		[SetUp]
+		public void CreateAssemblyList()
+		{
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml("<Config/>");
+			assemblies = new AssemblyList(doc.FirstChild);
+
+            path1 = CleanPath("/tests/bin/debug/assembly1.dll");
+            path2 = CleanPath("/tests/bin/debug/assembly2.dll");
+            path3 = CleanPath("/tests/bin/debug/assembly3.dll");
+        }
+
+		[Test]
+		public void EmptyList()
+		{
+			Assert.AreEqual( 0, assemblies.Count );
+		}
+
+        [Test]
+        public void CanAddAssemblies()
+        {
+            assemblies.Add(path1);
+            assemblies.Add(path2);
+
+            Assert.AreEqual(2, assemblies.Count);
+            Assert.AreEqual(path1, assemblies[0]);
+            Assert.AreEqual(path2, assemblies[1]);
+        }
+
+        [Test]
+        public void CanInsertAssemblies()
+        {
+            assemblies.Add(path1);
+            assemblies.Add(path3);
+            assemblies.Insert(1, path2);
+
+            Assert.AreEqual(3, assemblies.Count);
+            Assert.AreEqual(path1, assemblies[0]);
+            Assert.AreEqual(path2, assemblies[1]);
+            Assert.AreEqual(path3, assemblies[2]);
+        }
+
+        [Test]
+        public void CanInsertAssemblyAtEnd()
+        {
+            assemblies.Add(path1);
+            assemblies.Add(path2);
+            assemblies.Insert(2, path3);
+
+            Assert.AreEqual(3, assemblies.Count);
+            Assert.AreEqual(path1, assemblies[0]);
+            Assert.AreEqual(path2, assemblies[1]);
+            Assert.AreEqual(path3, assemblies[2]);
+        }
+
+        [Test]
+        public void CanInsertAssemblyAtStart()
+        {
+            assemblies.Add(path2);
+            assemblies.Add(path3);
+            assemblies.Insert(0, path1);
+
+            Assert.AreEqual(3, assemblies.Count);
+            Assert.AreEqual(path1, assemblies[0]);
+            Assert.AreEqual(path2, assemblies[1]);
+            Assert.AreEqual(path3, assemblies[2]);
+        }
+
+        [Test]
+        public void CanRemoveAssemblies()
+        {
+            assemblies.Add(path1);
+            assemblies.Add(path2);
+            assemblies.Add(path3);
+            
+            assemblies.Remove(path2);
+
+            Assert.AreEqual(2, assemblies.Count);
+            Assert.AreEqual(path1, assemblies[0]);
+            Assert.AreEqual(path3, assemblies[1]);
+        }
+
+        //[Test]
+        //public void CanRemoveAssemblyAtIndex()
+        //{
+        //    assemblies.Add(path1);
+        //    assemblies.Add(path2);
+        //    assemblies.Add(path3);
+        //    assemblies.RemoveAt(1);
+
+        //    Assert.AreEqual(2, assemblies.Count);
+        //    Assert.AreEqual(path1, assemblies[0]);
+        //    Assert.AreEqual(path3, assemblies[1]);
+        //}
+
+        //[Test]
+        //public void CanFindIndexOfAssembly()
+        //{
+        //    assemblies.Add(path1);
+        //    assemblies.Add(path2);
+        //    assemblies.Add(path3);
+
+        //    Assert.AreEqual(1, assemblies.IndexOf(path2));
+        //    Assert.AreEqual(-1, assemblies.IndexOf("/Not/in/list"));
+        //}
+
+        private string CleanPath( string path )
+        {
+            return path.Replace( '/', System.IO.Path.DirectorySeparatorChar );
+        }
+	}
+}
diff --git a/src/ProjectEditor/tests/Model/NUnitProjectSave.cs b/src/ProjectEditor/tests/Model/NUnitProjectSave.cs
new file mode 100644
index 0000000..071b4e9
--- /dev/null
+++ b/src/ProjectEditor/tests/Model/NUnitProjectSave.cs
@@ -0,0 +1,133 @@
+// ****************************************************************
+// 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.Text;
+using System.Xml;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Model
+{
+	[TestFixture]
+	public class NUnitProjectSave
+	{
+        private ProjectDocument doc;
+        private ProjectModel project;
+        private string xmlfile;
+
+		[SetUp]
+		public void SetUp()
+		{
+            doc = new ProjectDocument();
+            project = new ProjectModel(doc);
+            doc.CreateNewProject();
+            xmlfile = Path.ChangeExtension(Path.GetTempFileName(), ".nunit");
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			if ( File.Exists( xmlfile ) )
+				File.Delete( xmlfile );
+		}
+
+		[Test]
+		public void EmptyProject()
+		{
+			CheckContents( NUnitProjectXml.EmptyProject );
+		}
+
+		[Test]
+		public void EmptyConfigs()
+		{
+            project.AddConfig("Debug");
+            project.AddConfig("Release");
+            project.ActiveConfigName = "Debug";
+            project.Configs["Debug"].BinPathType = BinPathType.Auto;
+            project.Configs["Release"].BinPathType = BinPathType.Auto;
+
+			CheckContents( NUnitProjectXml.EmptyConfigs );			
+		}
+
+        [Test]
+        public void NormalProject()
+        {
+            IProjectConfig config1 = project.AddConfig("Debug");
+            config1.BasePath = "bin" + Path.DirectorySeparatorChar + "debug";
+            config1.BinPathType = BinPathType.Auto;
+            config1.Assemblies.Add("assembly1.dll");
+            config1.Assemblies.Add("assembly2.dll");
+
+            IProjectConfig config2 = project.AddConfig("Release");
+            config2.BasePath = "bin" + Path.DirectorySeparatorChar + "release";
+            config2.BinPathType = BinPathType.Auto;
+            config2.Assemblies.Add("assembly1.dll");
+            config2.Assemblies.Add("assembly2.dll");
+
+            project.ActiveConfigName = "Debug";
+
+            CheckContents(NUnitProjectXml.NormalProject);
+        }
+
+        [Test]
+        public void NormalProject_RoundTrip()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            CheckContents(NUnitProjectXml.NormalProject);
+        }
+
+        [Test]
+        public void ProjectWithComplexSettings()
+        {
+            IProjectConfig config1 = project.AddConfig("Debug");
+            config1.BasePath = "debug";
+            config1.BinPathType = BinPathType.Auto;
+            config1.RuntimeFramework = new RuntimeFramework(RuntimeType.Any, new Version(2, 0));
+            config1.Assemblies.Add("assembly1.dll");
+            config1.Assemblies.Add("assembly2.dll");
+
+            IProjectConfig config2 = project.AddConfig("Release");
+            config2.BasePath = "release";
+            config2.BinPathType = BinPathType.Auto;
+            config2.RuntimeFramework = new RuntimeFramework(RuntimeType.Any, new Version(4, 0));
+            config2.Assemblies.Add("assembly1.dll");
+            config2.Assemblies.Add("assembly2.dll");
+
+            project.ActiveConfigName = "Release";
+            project.BasePath = "bin";
+            project.ProcessModel = "Separate";
+            project.DomainUsage = "Multiple";
+
+            CheckContents(NUnitProjectXml.ComplexSettingsProject);
+        }
+
+        [Test]
+        public void ProjectWithComplexSettings_RoundTrip()
+        {
+            doc.LoadXml(NUnitProjectXml.ComplexSettingsProject);
+            CheckContents(NUnitProjectXml.ComplexSettingsProject);
+        }
+
+        [Test]
+        public void ProjectWithComplexSettings_RoundTripWithChanges()
+        {
+            doc.LoadXml(NUnitProjectXml.ComplexSettingsProject);
+            project.ProcessModel = "Single";
+            CheckContents(NUnitProjectXml.ComplexSettingsProject
+                .Replace("Separate", "Single"));
+        }
+
+        private void CheckContents(string expected)
+        {
+            doc.Save(xmlfile);
+            StreamReader reader = new StreamReader(xmlfile);
+            string contents = reader.ReadToEnd();
+            reader.Close();
+            Assert.That(contents, Is.EqualTo(expected));
+        }
+    }
+}
diff --git a/src/ProjectEditor/tests/Model/ProjectCreationTests.cs b/src/ProjectEditor/tests/Model/ProjectCreationTests.cs
new file mode 100644
index 0000000..e81629e
--- /dev/null
+++ b/src/ProjectEditor/tests/Model/ProjectCreationTests.cs
@@ -0,0 +1,153 @@
+// ****************************************************************
+// 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.IO;
+using System.Xml;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Model
+{
+    [TestFixture]
+    public class ProjectCreationTests
+    {
+        private ProjectDocument doc;
+        private ProjectModel project;
+        private string xmlfile;
+
+        private bool gotChangeNotice;
+
+        [SetUp]
+        public void SetUp()
+        {
+            doc = new ProjectDocument();
+            doc.CreateNewProject();
+            project = new ProjectModel(doc);
+
+            doc.ProjectChanged += OnProjectChange;
+            gotChangeNotice = false;
+
+            xmlfile = Path.ChangeExtension(Path.GetTempFileName(), ".nunit");
+        }
+
+        [TearDown]
+        public void EraseFile()
+        {
+            if (File.Exists(xmlfile))
+                File.Delete(xmlfile);
+        }
+
+        private void OnProjectChange()
+        {
+            gotChangeNotice = true;
+        }
+
+        [Test]
+        public void IsNotDirty()
+        {
+            Assert.IsFalse(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void ProjectPathIsSameAsName()
+        {
+            Assert.AreEqual(Path.GetFullPath(doc.Name), doc.ProjectPath);
+        }
+
+        [Test]
+        public void NameIsUnique()
+        {
+            ProjectDocument anotherProject = new ProjectDocument(xmlfile);
+            Assert.AreNotEqual(doc.Name, anotherProject.Name);
+        }
+
+        [Test]
+        public void RootElementIsNUnitProject()
+        {
+            Assert.AreEqual("NUnitProject", doc.RootNode.Name);
+        }
+
+        [Test]
+        public void ProjectNodeHasNoChildren()
+        {
+            Assert.AreEqual(0, doc.RootNode.ChildNodes.Count);
+        }
+
+        [Test]
+        public void ProjectNodeHasNoAttributes()
+        {
+            Assert.AreEqual(0, doc.RootNode.Attributes.Count);
+        }
+
+        [Test]
+        public void NewProjectHasNoConfigs()
+        {
+            Assert.AreEqual(0, project.Configs.Count);
+            Assert.IsNull(project.ActiveConfigName);
+        }
+
+        [Test]
+        public void SaveMakesProjectNotDirty()
+        {
+            project.AddConfig("Debug");
+            doc.Save(xmlfile);
+            Assert.IsFalse(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void SaveSetsProjectPathAndName()
+        {
+            doc.Save(xmlfile);
+            Assert.AreEqual(Path.GetFullPath(xmlfile), doc.ProjectPath);
+            Assert.AreEqual(Path.GetFileNameWithoutExtension(xmlfile), doc.Name);
+        }
+
+        [Test]
+        public void DefaultProjectName()
+        {
+            Assert.That(doc.Name, Is.StringMatching(@"Project\d"));
+        }
+
+        [Test]
+        public void CanSetAppBase()
+        {
+            project.BasePath = "..";
+            Assert.AreEqual("..", project.BasePath);
+        }
+
+        [Test]
+        public void CanAddConfigs()
+        {
+            project.AddConfig("Debug");
+            project.AddConfig("Release");
+            Assert.AreEqual(2, project.Configs.Count);
+        }
+
+        [Test]
+        public void LoadMakesProjectNotDirty()
+        {
+            project.AddConfig("Debug");
+            doc.Save(xmlfile);
+            ProjectDocument doc2 = new ProjectDocument(xmlfile);
+            doc2.Load();
+            Assert.IsFalse(doc2.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void AddConfigMakesProjectDirty()
+        {
+            project.AddConfig("Debug");
+            Assert.IsTrue(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void AddConfigFiresChangedEvent()
+        {
+            project.AddConfig("Debug");
+            Assert.IsTrue(gotChangeNotice);
+        }
+    }
+}
diff --git a/src/ProjectEditor/tests/Model/ProjectDocumentTests.cs b/src/ProjectEditor/tests/Model/ProjectDocumentTests.cs
new file mode 100644
index 0000000..d5e3d31
--- /dev/null
+++ b/src/ProjectEditor/tests/Model/ProjectDocumentTests.cs
@@ -0,0 +1,72 @@
+// ****************************************************************
+// 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.IO;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Model
+{
+    [TestFixture]
+    public class ProjectDocumentTests
+    {
+        static readonly string xmlfile = "test.nunit";
+
+        private ProjectDocument doc;
+        private bool gotChangeNotice;
+
+        [SetUp]
+        public void SetUp()
+        {
+            doc = new ProjectDocument();
+            doc.CreateNewProject();
+            doc.ProjectChanged += new ActionDelegate(OnProjectChange);
+
+            gotChangeNotice = false;
+        }
+
+        [TearDown]
+        public void EraseFile()
+        {
+            if (File.Exists(xmlfile))
+                File.Delete(xmlfile);
+        }
+
+        private void OnProjectChange()
+        {
+            gotChangeNotice = true;
+        }
+
+        [Test]
+        public void AddingElementMakesProjectDirty()
+        {
+            XmlHelper.AddElement(doc.RootNode, "Settings");
+            Assert.True(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void AddingElementFiresChangedEvent()
+        {
+            XmlHelper.AddElement(doc.RootNode, "Settings");
+            Assert.True(gotChangeNotice);
+        }
+
+        [Test]
+        public void AddingAttributeMakesProjectDirty()
+        {
+            XmlHelper.AddAttribute(doc.RootNode, "Version", "1.0");
+            Assert.True(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void AddingAttributeFiresChangedEvent()
+        {
+            XmlHelper.AddAttribute(doc.RootNode, "Version", "1.0");
+            Assert.True(gotChangeNotice);
+        }
+
+    }
+}
diff --git a/src/ProjectEditor/tests/Model/ProjectModelChangeTests.cs b/src/ProjectEditor/tests/Model/ProjectModelChangeTests.cs
new file mode 100644
index 0000000..a4925a2
--- /dev/null
+++ b/src/ProjectEditor/tests/Model/ProjectModelChangeTests.cs
@@ -0,0 +1,140 @@
+// ****************************************************************
+// 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.IO;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Model
+{
+    class ProjectModelChangeTests
+    {
+        static readonly string xmlfile = "MyProject.nunit";
+
+        private ProjectDocument doc;
+        private ProjectModel project;
+        private bool gotChangeNotice;
+
+        [SetUp]
+        public void SetUp()
+        {
+            doc = new ProjectDocument(xmlfile);
+            project = new ProjectModel(doc);
+
+            doc.ProjectChanged += OnProjectChange;
+            gotChangeNotice = false;
+        }
+
+        private void OnProjectChange()
+        {
+            gotChangeNotice = true;
+        }
+
+        [Test]
+        public void RenameConfigMakesProjectDirty()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.Configs[0].Name = "New";
+            Assert.IsTrue(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void RenameConfigFiresChangedEvent()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.Configs[0].Name = "New";
+            Assert.IsTrue(gotChangeNotice);
+        }
+
+        [Test]
+        public void RenamingActiveConfigChangesActiveConfigName()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.ActiveConfigName = "Debug";
+
+            project.Configs[0].Name = "New";
+
+            Assert.AreEqual("New", project.ActiveConfigName);
+        }
+
+        [Test]
+        public void RemoveConfigMakesProjectDirty()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.RemoveConfig("Debug");
+            Assert.IsTrue(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void RemoveConfigFiresChangedEvent()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.RemoveConfig("Debug");
+            Assert.IsTrue(gotChangeNotice);
+        }
+
+        [Test]
+        public void RemovingActiveConfigRemovesActiveConfigNameAttribute()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.ActiveConfigName = "Debug";
+            project.RemoveConfig("Debug");
+            Assert.AreEqual(null, project.ActiveConfigName);
+        }
+
+        [Test]
+        public void SettingActiveConfigMakesProjectDirty()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.ActiveConfigName = "Release";
+            Assert.IsTrue(doc.HasUnsavedChanges);
+        }
+
+        [Test]
+        public void SettingActiveConfigFiresChangedEvent()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.ActiveConfigName = "Release";
+            Assert.IsTrue(gotChangeNotice);
+        }
+
+        [Test]
+        public void CanSetActiveConfig()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.ActiveConfigName = "Release";
+            Assert.AreEqual("Release", project.ActiveConfigName);
+        }
+
+        [Test]
+        public void CanAddAssemblies()
+        {
+            doc.LoadXml(NUnitProjectXml.EmptyConfigs);
+            project.Configs["Debug"].Assemblies.Add(Path.GetFullPath(@"bin\debug\assembly1.dll"));
+            project.Configs["Debug"].Assemblies.Add(Path.GetFullPath(@"bin\debug\assembly2.dll"));
+            project.Configs["Release"].Assemblies.Add(Path.GetFullPath(@"bin\debug\assembly3.dll"));
+
+            Assert.AreEqual(2, project.Configs.Count);
+            Assert.AreEqual(2, project.Configs["Debug"].Assemblies.Count);
+            Assert.AreEqual(1, project.Configs["Release"].Assemblies.Count);
+        }
+
+        [Test]
+        public void AddingAssemblyFiresChangedEvent()
+        {
+            doc.LoadXml(NUnitProjectXml.EmptyConfigs);
+            project.Configs["Debug"].Assemblies.Add("assembly1.dll");
+            Assert.IsTrue(gotChangeNotice);
+        }
+
+        [Test]
+        public void RemoveAssemblyFiresChangedEvent()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            project.Configs["Debug"].Assemblies.Remove("assembly1.dll");
+            Assert.IsTrue(gotChangeNotice);
+        }
+    }
+}
diff --git a/src/ProjectEditor/tests/Model/ProjectModelLoadtests.cs b/src/ProjectEditor/tests/Model/ProjectModelLoadtests.cs
new file mode 100644
index 0000000..80cb531
--- /dev/null
+++ b/src/ProjectEditor/tests/Model/ProjectModelLoadtests.cs
@@ -0,0 +1,193 @@
+// ****************************************************************
+// 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.IO;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Model
+{
+    [TestFixture]
+    public class ProjectModelLoadtests
+    {
+        private ProjectDocument doc;
+        private ProjectModel project;
+        private string xmlfile;
+
+        [SetUp]
+        public void SetUp()
+        {
+            xmlfile = Path.ChangeExtension(Path.GetTempFileName(), ".nunit");
+            doc = new ProjectDocument(xmlfile);
+            project = new ProjectModel(doc);
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            if (File.Exists(xmlfile))
+                File.Delete(xmlfile);
+        }
+
+        [Test]
+        public void LoadEmptyProject()
+        {
+            doc.LoadXml(NUnitProjectXml.EmptyProject);
+
+            Assert.AreEqual(Path.GetFullPath(xmlfile), project.ProjectPath);
+            
+            Assert.AreEqual(null, project.BasePath);
+            Assert.AreEqual(Path.GetDirectoryName(project.ProjectPath), project.EffectiveBasePath);
+
+            Assert.AreEqual("Default", project.ProcessModel);
+            Assert.AreEqual("Default", project.DomainUsage);
+
+            Assert.AreEqual(0, project.Configs.Count);
+            Assert.AreEqual(0, project.ConfigNames.Length);
+
+            Assert.AreEqual(null, project.ActiveConfigName);
+        }
+
+        [Test]
+        public void LoadEmptyConfigs()
+        {
+            doc.LoadXml(NUnitProjectXml.EmptyConfigs);
+
+            Assert.AreEqual(Path.GetFullPath(xmlfile), project.ProjectPath);
+
+            Assert.AreEqual(null, project.BasePath);
+            Assert.AreEqual(Path.GetDirectoryName(project.ProjectPath), project.EffectiveBasePath);
+
+            Assert.AreEqual("Default", project.ProcessModel);
+            Assert.AreEqual("Default", project.DomainUsage);
+
+            Assert.AreEqual(2, project.Configs.Count);
+            Assert.AreEqual(new string[] { "Debug", "Release" }, project.ConfigNames);
+
+            Assert.AreEqual("Debug", project.ActiveConfigName);
+
+            Assert.AreEqual("Debug", project.Configs[0].Name);
+            Assert.AreEqual("Release", project.Configs[1].Name);
+        }
+
+        [Test]
+        public void LoadNormalProject()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+
+            Assert.AreEqual(Path.GetFullPath(xmlfile), project.ProjectPath);
+
+            Assert.AreEqual(null, project.BasePath);
+            Assert.AreEqual(Path.GetDirectoryName(project.ProjectPath), project.EffectiveBasePath);
+
+            Assert.AreEqual("Default", project.ProcessModel);
+            Assert.AreEqual("Default", project.DomainUsage);
+
+            Assert.AreEqual(2, project.Configs.Count);
+            Assert.AreEqual(new string[] { "Debug", "Release" }, project.ConfigNames);
+
+            Assert.AreEqual("Debug", project.ActiveConfigName);
+
+            IProjectConfig config1 = project.Configs[0];
+            Assert.AreEqual(2, config1.Assemblies.Count);
+            Assert.AreEqual(
+                "assembly1.dll",
+                config1.Assemblies[0]);
+            Assert.AreEqual(
+                "assembly2.dll",
+                config1.Assemblies[1]);
+
+            IProjectConfig config2 = project.Configs[1];
+            Assert.AreEqual(2, config2.Assemblies.Count);
+            Assert.AreEqual(
+                "assembly1.dll",
+                config2.Assemblies[0]);
+            Assert.AreEqual(
+                "assembly2.dll",
+                config2.Assemblies[1]);
+        }
+
+        [Test]
+        public void LoadProjectWithManualBinPath()
+        {
+            doc.LoadXml(NUnitProjectXml.ManualBinPathProject);
+
+            Assert.AreEqual(Path.GetFullPath(xmlfile), project.ProjectPath);
+
+            Assert.AreEqual(null, project.BasePath);
+            Assert.AreEqual(Path.GetDirectoryName(project.ProjectPath), project.EffectiveBasePath);
+
+            Assert.AreEqual("Default", project.ProcessModel);
+            Assert.AreEqual("Default", project.DomainUsage);
+
+            Assert.AreEqual(1, project.Configs.Count);
+            Assert.AreEqual(new string[] { "Debug" }, project.ConfigNames);
+
+            IProjectConfig config1 = project.Configs["Debug"];
+            Assert.AreEqual("bin_path_value", config1.PrivateBinPath);
+        }
+
+        [Test]
+        public void LoadProjectWithComplexSettings()
+        {
+            doc.LoadXml(NUnitProjectXml.ComplexSettingsProject);
+            Assert.AreEqual("bin", project.BasePath);
+            Assert.AreEqual("Separate", project.ProcessModel);
+            Assert.AreEqual("Multiple", project.DomainUsage);
+
+            Assert.AreEqual(2, project.Configs.Count);
+
+            IProjectConfig config1 = project.Configs[0];
+            Assert.AreEqual(
+                "debug",
+                config1.BasePath);
+            Assert.AreEqual(RuntimeType.Any, config1.RuntimeFramework.Runtime);
+            Assert.AreEqual("2.0", config1.RuntimeFramework.Version.ToString(2));
+            Assert.AreEqual(2, config1.Assemblies.Count);
+            Assert.AreEqual(
+                "assembly1.dll",
+                config1.Assemblies[0]);
+            Assert.AreEqual(
+                "assembly2.dll",
+                config1.Assemblies[1]);
+
+            IProjectConfig config2 = project.Configs[1];
+            Assert.AreEqual(2, config2.Assemblies.Count);
+            Assert.AreEqual(
+                "release",
+                config2.BasePath);
+            Assert.AreEqual(RuntimeType.Any, config2.RuntimeFramework.Runtime);
+            Assert.AreEqual("4.0", config2.RuntimeFramework.Version.ToString(2));
+            Assert.AreEqual(
+                "assembly1.dll",
+                config2.Assemblies[0]);
+            Assert.AreEqual(
+                "assembly2.dll",
+                config2.Assemblies[1]);
+        }
+
+        [Test]
+        public void CanSaveAndReloadProject()
+        {
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            doc.Save(xmlfile);
+            Assert.IsTrue(File.Exists(xmlfile));
+
+            ProjectDocument doc2 = new ProjectDocument(xmlfile);
+            doc2.Load();
+            ProjectModel project2 = new ProjectModel(doc2);
+
+            Assert.AreEqual(2, project2.Configs.Count);
+
+            Assert.AreEqual(2, project2.Configs[0].Assemblies.Count);
+            Assert.AreEqual("assembly1.dll", project2.Configs[0].Assemblies[0]);
+            Assert.AreEqual("assembly2.dll", project2.Configs[0].Assemblies[1]);
+
+            Assert.AreEqual(2, project2.Configs[1].Assemblies.Count);
+            Assert.AreEqual("assembly1.dll", project2.Configs[1].Assemblies[0]);
+            Assert.AreEqual("assembly2.dll", project2.Configs[1].Assemblies[1]);
+        }
+    }
+}
diff --git a/src/ProjectEditor/tests/NUnitProjectXml.cs b/src/ProjectEditor/tests/NUnitProjectXml.cs
new file mode 100644
index 0000000..5199fe0
--- /dev/null
+++ b/src/ProjectEditor/tests/NUnitProjectXml.cs
@@ -0,0 +1,58 @@
+// ****************************************************************
+// 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.IO;
+
+namespace NUnit.ProjectEditor.Tests
+{
+	/// <summary>
+	/// Summary description for NUnitProjectXml.
+	/// </summary>
+	public class NUnitProjectXml
+	{
+		public static readonly string EmptyProject = "<NUnitProject />";
+		
+		public static readonly string EmptyConfigs = 
+			"<NUnitProject>" + System.Environment.NewLine +
+			"  <Settings activeconfig=\"Debug\" />" + System.Environment.NewLine +
+			"  <Config name=\"Debug\" binpathtype=\"Auto\" />" + System.Environment.NewLine +
+			"  <Config name=\"Release\" binpathtype=\"Auto\" />" + System.Environment.NewLine +
+			"</NUnitProject>";
+
+        public static readonly string NormalProject =
+            "<NUnitProject>" + System.Environment.NewLine +
+            "  <Settings activeconfig=\"Debug\" />" + System.Environment.NewLine +
+            "  <Config name=\"Debug\" appbase=\"bin" + Path.DirectorySeparatorChar + "debug\" binpathtype=\"Auto\">" + System.Environment.NewLine +
+            "    <assembly path=\"assembly1.dll\" />" + System.Environment.NewLine +
+            "    <assembly path=\"assembly2.dll\" />" + System.Environment.NewLine +
+            "  </Config>" + System.Environment.NewLine +
+            "  <Config name=\"Release\" appbase=\"bin" + Path.DirectorySeparatorChar + "release\" binpathtype=\"Auto\">" + System.Environment.NewLine +
+            "    <assembly path=\"assembly1.dll\" />" + System.Environment.NewLine +
+            "    <assembly path=\"assembly2.dll\" />" + System.Environment.NewLine +
+            "  </Config>" + System.Environment.NewLine +
+            "</NUnitProject>";
+
+        public static readonly string ManualBinPathProject =
+			"<NUnitProject>" + System.Environment.NewLine +
+			"  <Settings activeconfig=\"Debug\" />" + System.Environment.NewLine +
+			"  <Config name=\"Debug\" binpath=\"bin_path_value\"  /> " + System.Environment.NewLine +
+			"</NUnitProject>";
+
+        public static readonly string ComplexSettingsProject =
+        "<NUnitProject>" + System.Environment.NewLine +
+        "  <Settings activeconfig=\"Release\" appbase=\"bin\" processModel=\"Separate\" domainUsage=\"Multiple\" />" + System.Environment.NewLine +
+        "  <Config name=\"Debug\" appbase=\"debug\" binpathtype=\"Auto\" runtimeFramework=\"v2.0\">" + System.Environment.NewLine +
+        "    <assembly path=\"assembly1.dll\" />" + System.Environment.NewLine +
+        "    <assembly path=\"assembly2.dll\" />" + System.Environment.NewLine +
+        "  </Config>" + System.Environment.NewLine +
+        "  <Config name=\"Release\" appbase=\"release\" binpathtype=\"Auto\" runtimeFramework=\"v4.0\">" + System.Environment.NewLine +
+        "    <assembly path=\"assembly1.dll\" />" + System.Environment.NewLine +
+        "    <assembly path=\"assembly2.dll\" />" + System.Environment.NewLine +
+        "  </Config>" + System.Environment.NewLine +
+        "</NUnitProject>";
+    }
+}
diff --git a/src/ProjectEditor/tests/Presenters/AddConfigurationPresenterTests.cs b/src/ProjectEditor/tests/Presenters/AddConfigurationPresenterTests.cs
new file mode 100644
index 0000000..50e5516
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/AddConfigurationPresenterTests.cs
@@ -0,0 +1,86 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using System.IO;
+using NSubstitute;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Presenters
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class AddConfigurationPresenterTests
+    {
+        IProjectModel model;
+        IAddConfigurationDialog dlg;
+        AddConfigurationPresenter presenter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            IProjectDocument doc = new ProjectDocument();
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            model = new ProjectModel(doc);
+
+            dlg = Substitute.For<IAddConfigurationDialog>();
+
+            presenter = new AddConfigurationPresenter(model, dlg);
+        }
+
+        [Test]
+        public void ConfigList_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(dlg.ConfigList, Is.EqualTo(new string[] {"Debug", "Release"}));
+        }
+
+        [Test]
+        public void AddButton_AddNewConfig_IsAddedToList()
+        {
+            dlg.ConfigToCreate.Returns("New");
+            dlg.OkButton.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] {"Debug", "Release", "New"}));
+        }
+
+        [Test]
+        public void AddButton_AddExistingConfig_FailsWithErrorMessage()
+        {
+            dlg.ConfigToCreate.Returns("Release");
+            dlg.OkButton.Execute += Raise.Event<CommandDelegate>();
+
+            dlg.MessageDisplay.Received().Error("A configuration with that name already exists");
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] { "Debug", "Release" }));
+        }
+
+        [Test]
+        public void ConfigToCopy_WhenNotSpecified_ConfigIsEmpty()
+        {
+            dlg.ConfigToCreate.Returns("New");
+            dlg.ConfigToCopy.Returns("<none>");
+
+            dlg.OkButton.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] { "Debug", "Release", "New" }));
+            Assert.That(model.Configs[2].BasePath, Is.EqualTo(null));
+            Assert.That(model.Configs[2].Assemblies.Count, Is.EqualTo(0));
+        }
+
+        [Test]
+        public void ConfigToCopy_WhenSpecified_ConfigIsCopied()
+        {
+            dlg.ConfigToCreate.Returns("New");
+            dlg.ConfigToCopy.Returns("Release");
+
+            dlg.OkButton.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] { "Debug", "Release", "New" }));
+            Assert.That(model.Configs[2].BasePath, Is.EqualTo("bin" + Path.DirectorySeparatorChar + "release"));
+            Assert.That(model.Configs[2].Assemblies.Count, Is.EqualTo(2));
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/ProjectEditor/tests/Presenters/ConfigurationEditorTests.cs b/src/ProjectEditor/tests/Presenters/ConfigurationEditorTests.cs
new file mode 100644
index 0000000..c8646e7
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/ConfigurationEditorTests.cs
@@ -0,0 +1,152 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using System.Windows.Forms;
+using NUnit.Framework;
+using NUnit.ProjectEditor.ViewElements;
+using NSubstitute;
+
+namespace NUnit.ProjectEditor.Tests.Presenters
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class ConfigurationEditorTests
+    {
+        private IConfigurationEditorDialog view;
+
+        private ProjectModel model;
+        private ConfigurationEditor editor;
+
+        [SetUp]
+        public void Initialize()
+        {
+            ProjectDocument doc = new ProjectDocument();
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            model = new ProjectModel(doc);
+
+            view = Substitute.For<IConfigurationEditorDialog>();
+
+            editor = new ConfigurationEditor(model, view);
+        }
+
+        [Test]
+        public void AddButton_OnLoad_IsSubscribed()
+        {
+            view.AddCommand.Received().Execute += editor.AddConfig;
+        }
+
+        [Test]
+        public void RemoveButton_OnLoad_IsSubscribed()
+        {
+            view.RemoveCommand.Received().Execute += editor.RemoveConfig;
+        }
+
+        [Test]
+        public void RenameButton_OnLoad_IsSubscribed()
+        {
+            view.RenameCommand.Received().Execute += editor.RenameConfig;
+        }
+
+        [Test]
+        public void ActiveButton_OnLoad_IsSubscribed()
+        {
+            view.ActiveCommand.Received().Execute += editor.MakeActive;
+        }
+
+        [Test]
+        public void ConfigList_OnLoad_SelectionChangedIsSubscribed()
+        {
+            view.ConfigList.Received().SelectionChanged += editor.SelectedConfigChanged;
+        }
+
+        [Test]
+        public void ConfigList_OnLoad_IsCorrectlyInitialized()
+        {
+            Assert.That(view.ConfigList.SelectionList, Is.EqualTo( new string[] { "Debug (active)", "Release" }));
+        }
+
+        [Test]
+        public void AddButton_OnLoad_IsEnabled()
+        {
+            Assert.True(view.AddCommand.Enabled);
+        }
+
+        [Test]
+        public void RemoveButton_OnLoad_IsEnabled()
+        {
+            Assert.True(view.RemoveCommand.Enabled);
+        }
+
+        [Test]
+        public void RenameButton_OnLoad_IsEnabled()
+        {
+            Assert.True(view.RenameCommand.Enabled);
+        }
+
+        [Test]
+        public void ActiveButton_OnLoad_IsDisabled()
+        {
+            Assert.False(view.ActiveCommand.Enabled);
+        }
+
+        [Test]
+        public void AddButton_WhenClicked_AddsNewConfig()
+        {
+            view.AddConfigurationDialog.ShowDialog().Returns(delegate
+            {
+                view.AddConfigurationDialog.OkButton.Execute += Raise.Event<CommandDelegate>();
+                return DialogResult.OK;
+            });
+            view.AddConfigurationDialog.ConfigToCreate.Returns("New");
+            view.AddConfigurationDialog.ConfigToCopy.Returns("Release");
+
+            view.AddCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.Configs.Count, Is.EqualTo(3));
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] { "Debug", "Release", "New" }));
+        }
+
+        [Test]
+        public void RemoveButton_WhenClicked_RemovesConfig()
+        {
+            view.RemoveCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.Configs.Count, Is.EqualTo(1));
+            Assert.That(model.Configs[0].Name, Is.EqualTo("Release"));
+        }
+
+        private void RaiseExecute(ICommand command)
+        {
+            command.Execute += Raise.Event<CommandDelegate>();
+        }
+
+        [Test]
+        public void RenameButton_WhenClicked_PerformsRename()
+        {
+            view.ConfigList.SelectedItem.Returns("Debug");
+            view.RenameConfigurationDialog.ShowDialog().Returns(delegate
+            {
+                view.RenameConfigurationDialog.ConfigurationName.Text = "NewName";
+                view.RenameConfigurationDialog.OkButton.Execute += Raise.Event<CommandDelegate>();
+                return DialogResult.OK;
+            });
+
+            view.RenameCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.Configs[0].Name, Is.EqualTo("NewName"));
+        }
+
+        [Test]
+        public void ActiveButton_WhenClicked_MakesConfigActive()
+        {
+            view.ConfigList.SelectedItem = "Release";
+            RaiseExecute(view.ActiveCommand);
+            Assert.That(model.ActiveConfigName, Is.EqualTo("Release"));
+        }
+    }
+}
+#endif
diff --git a/src/ProjectEditor/tests/Presenters/MainPresenterTests.cs b/src/ProjectEditor/tests/Presenters/MainPresenterTests.cs
new file mode 100644
index 0000000..678104e
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/MainPresenterTests.cs
@@ -0,0 +1,209 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using NSubstitute;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.ProjectEditor.Tests.Presenters
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class MainPresenterTests
+    {
+        // TODO: Embed project resources
+        private static readonly string GOOD_PROJECT = "NUnitTests.nunit";
+        private static readonly string BAD_PROJECT = "BadProject.nunit";
+        private static readonly string NONEXISTENT_PROJECT = "NonExistent.nunit";
+
+        private IMainView view;
+        private IProjectDocument doc;
+        private MainPresenter presenter;
+
+        [SetUp]
+        public void Initialize()
+        {
+            view = Substitute.For<IMainView>();
+            doc = new ProjectDocument();
+            presenter = new MainPresenter(doc, view);
+        }
+
+        [Test]
+        public void ActiveViewChanged_WhenNoProjectIsOpen_TabViewsRemainHidden()
+        {
+            view.SelectedView.Returns(SelectedView.XmlView);
+            view.ActiveViewChanged += Raise.Event<ActiveViewChangedHandler>();
+            Assert.False(view.PropertyView.Visible);
+            Assert.False(view.XmlView.Visible);
+
+            view.SelectedView.Returns(SelectedView.PropertyView);
+            view.ActiveViewChanged += Raise.Event<ActiveViewChangedHandler>();
+            Assert.False(view.PropertyView.Visible);
+            Assert.False(view.XmlView.Visible);
+        }
+
+        [Test]
+        public void ActiveViewChanged_WhenProjectIsOpen_TabViewsAreVisible()
+        {
+            doc.CreateNewProject();
+
+            view.SelectedView.Returns(SelectedView.XmlView);
+            view.ActiveViewChanged += Raise.Event<ActiveViewChangedHandler>();
+
+            Assert.True(view.PropertyView.Visible);
+            Assert.True(view.XmlView.Visible);
+
+        }
+
+        [Test]
+        public void CloseProject_OnLoad_IsDisabled()
+        {
+            Assert.False(view.CloseProjectCommand.Enabled);
+        }
+
+        [Test]
+        public void CloseProject_AfterCreatingNewProject_IsEnabled()
+        {
+            view.NewProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.True(view.CloseProjectCommand.Enabled);
+        }
+
+        [Test]
+        public void CloseProject_AfterOpeningGoodProject_IsEnabled()
+        {
+            using (TempFile file = new TempFile(GOOD_PROJECT))
+            {
+                view.DialogManager.GetFileOpenPath("", "", "").ReturnsForAnyArgs(file.Path);
+                view.OpenProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+                Assert.True(view.CloseProjectCommand.Enabled);
+            }
+        }
+
+        [Test]
+        public void NewProject_OnLoad_IsEnabled()
+        {
+            Assert.True(view.NewProjectCommand.Enabled);
+        }
+
+        [Test]
+        public void NewProject_WhenClicked_CreatesNewProject()
+        {
+            view.NewProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.IsNotNull(doc.RootNode);
+            Assert.That(doc.Name, Is.StringMatching("Project\\d"));
+        }
+
+        [Test]
+        public void OpenProject_OnLoad_IsEnabled()
+        {
+            Assert.True(view.OpenProjectCommand.Enabled);
+        }
+
+        [Test]
+        public void OpenProject_WhenClickedAndProjectIsValid_OpensProject()
+        {
+            using (TempFile file = new TempFile(GOOD_PROJECT))
+            {
+                view.DialogManager.GetFileOpenPath("Open", "", "").ReturnsForAnyArgs(file.Path);
+                view.OpenProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+                Assert.NotNull(doc.XmlText);
+                Assert.NotNull(doc.RootNode);
+                Assert.AreEqual("NUnitTests", doc.Name);
+            }
+        }
+
+        [Test]
+        public void OpenProject_WhenClickedAndProjectXmlIsNotValid_OpensProject()
+        {
+            using (TempFile file = new TempFile(BAD_PROJECT))
+            {
+                view.DialogManager.GetFileOpenPath("Open", "", "").ReturnsForAnyArgs(file.Path);
+                view.OpenProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+                Assert.NotNull(doc.XmlText);
+                Assert.Null(doc.RootNode);
+                Assert.AreEqual("BadProject", doc.Name);
+
+                Assert.AreEqual(SelectedView.XmlView, view.SelectedView);
+            }
+        }
+
+        [Test]
+        public void OpenProject_WhenClickedAndProjectDoesNotExist_DisplaysError()
+        {
+            view.DialogManager.GetFileOpenPath("Open", "", "").ReturnsForAnyArgs(NONEXISTENT_PROJECT);
+            view.OpenProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+            view.MessageDisplay.Received().Error(Arg.Is((string x) => x.StartsWith("Could not find file")));
+
+            Assert.Null(doc.XmlText);
+            Assert.Null(doc.RootNode);
+        }
+
+        [Test]
+        public void SaveProject_OnLoad_IsDisabled()
+        {
+            Assert.False(view.SaveProjectCommand.Enabled);
+        }
+
+        [Test]
+        public void SaveProject_AfterCreatingNewProject_IsEnabled()
+        {
+            view.NewProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.True(view.SaveProjectCommand.Enabled);
+        }
+
+        [Test]
+        public void SaveProject_AfterOpeningGoodProject_IsEnabled()
+        {
+            using (TempFile file = new TempFile(GOOD_PROJECT))
+            {
+                view.DialogManager.GetFileOpenPath("", "", "").ReturnsForAnyArgs(file.Path);
+                view.OpenProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+                Assert.True(view.SaveProjectCommand.Enabled);
+            }
+        }
+
+        [Test]
+        public void SaveProjectAs_OnLoad_IsDisabled()
+        {
+            Assert.False(view.SaveProjectAsCommand.Enabled);
+        }
+
+        [Test]
+        public void SaveProjectAs_AfterCreatingNewProject_IsEnabled()
+        {
+            view.NewProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.True(view.SaveProjectAsCommand.Enabled);
+        }
+
+        [Test]
+        public void SaveProjectAs_AfterOpeningGoodProject_IsEnabled()
+        {
+            using (TempFile file = new TempFile(GOOD_PROJECT))
+            {
+                view.DialogManager.GetFileOpenPath("", "", "").ReturnsForAnyArgs(file.Path);
+                view.OpenProjectCommand.Execute += Raise.Event<CommandDelegate>();
+
+                Assert.True(view.SaveProjectAsCommand.Enabled);
+            }
+        }
+
+        private class TempFile : TempResourceFile
+        {
+            public TempFile(string name) : base(typeof(NUnitProjectXml), "resources." + name, name) { }
+        }
+    }
+}
+#endif
diff --git a/src/ProjectEditor/tests/Presenters/PropertyPresenterTests.cs b/src/ProjectEditor/tests/Presenters/PropertyPresenterTests.cs
new file mode 100644
index 0000000..9c57058
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/PropertyPresenterTests.cs
@@ -0,0 +1,267 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using System.IO;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.ProjectEditor.ViewElements;
+using NSubstitute;
+
+namespace NUnit.ProjectEditor.Tests.Presenters
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class PropertyPresenterTests
+    {
+        IProjectDocument doc;
+        private IProjectModel model;
+        private IPropertyView view;
+        private PropertyPresenter presenter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            doc = new ProjectDocument();
+            doc.LoadXml(NUnitProjectXml.NormalProject);
+            model = new ProjectModel(doc);
+            model.ActiveConfigName = "Release";
+
+            view = Substitute.For<IPropertyView>();
+            view.ConfigList.Returns(new SelectionStub("ConfigList"));
+            view.ProcessModel.Returns(new SelectionStub("ProcessModel"));
+            view.DomainUsage.Returns(new SelectionStub("DomainUsage"));
+            view.Runtime.Returns(new SelectionStub("Runtime"));
+            view.RuntimeVersion.Returns(new SelectionStub("RuntimeVersion"));
+            view.AssemblyList.Returns(new SelectionStub("AssemblyList"));
+
+            presenter = new PropertyPresenter(model, view);
+            presenter.LoadViewFromModel();
+        }
+
+        [Test]
+        public void ActiveConfigName_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.ActiveConfigName.Text, Is.EqualTo("Release"));
+        }
+
+        [Test]
+        public void ApplicationBase_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.ApplicationBase.Text, Is.EqualTo(model.Configs[0].BasePath));
+        }
+
+        [Test]
+        public void AssemblyPath_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.AssemblyPath.Text, Is.EqualTo(model.Configs[0].Assemblies[0]));
+        }
+
+        [Test]
+        public void AssemblyList_LoadFromModel_SetsListCorrectly()
+        {
+            Assert.That(view.AssemblyList.SelectionList, 
+                Is.EqualTo(new string[] {"assembly1.dll", "assembly2.dll"}));
+        }
+
+        [Test]
+        public void AssemblyList_WhenEmpty_AddIsEnabled()
+        {
+            view.AssemblyList.SelectionList = new string[0];
+            view.AssemblyList.SelectedIndex = -1;
+
+            Assert.True(view.AddAssemblyCommand.Enabled);
+        }
+
+        [Test]
+        public void AssemblyList_WhenEmpty_RemoveIsDisabled()
+        {
+            view.AssemblyList.SelectionList = new string[0];
+            view.AssemblyList.SelectedIndex = -1;
+
+            Assert.False(view.RemoveAssemblyCommand.Enabled);
+        }
+
+        [Test]
+        public void AssemblyList_WhenEmpty_AssemblyPathBrowseIsDisabled()
+        {
+            view.AssemblyList.SelectionList = new string[0];
+            view.AssemblyList.SelectedIndex = -1;
+
+            Assert.False(view.BrowseAssemblyPathCommand.Enabled);
+        }
+
+        [Test]
+        public void BinPathType_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.BinPathType.SelectedIndex, Is.EqualTo((int)model.Configs[0].BinPathType));
+        }
+
+        [Test]
+        public void ConfigList_LoadFromModel_SelectsFirstConfig()
+        {
+            Assert.That(view.ConfigList.SelectedIndex, Is.EqualTo(0));
+            Assert.That(view.ConfigList.SelectedItem, Is.EqualTo("Debug"));
+        }
+
+        [Test]
+        public void ConfigList_LoadFromModel_SetsListCorrectly()
+        {
+            Assert.That(view.ConfigList.SelectionList, Is.EqualTo(
+                new string[] { "Debug", "Release" }));
+        }
+
+        public void ConfigList_SelectionChanged_UpdatesRuntime()
+        {
+        }
+
+        [Test]
+        public void ConfigurationFile_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.ConfigurationFile.Text, Is.EqualTo(model.Configs[0].ConfigurationFile));
+        }
+
+        [Test]
+        public void DomainUsage_LoadFromModel_SetsOptionsCorrectly()
+        {
+            Assert.That(view.DomainUsage.SelectionList, Is.EqualTo(
+                new string[] { "Default", "Single", "Multiple" }));
+        }
+
+        [Test]
+        public void DomainUsage_LoadFromModel_SelectsDefaultEntry()
+        {
+            Assert.That(view.DomainUsage.SelectedItem, Is.EqualTo("Default"));
+        }
+
+        [Test]
+        public void DomainUsage_WhenChanged_UpdatesProject()
+        {
+            view.DomainUsage.SelectedItem = "Multiple";
+            Assert.That(model.DomainUsage, Is.EqualTo("Multiple"));
+        }
+
+        [Test]
+        public void PrivateBinPath_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.PrivateBinPath.Text, Is.EqualTo(string.Empty));
+        }
+
+        [Test]
+        public void ProcessModel_LoadFromModel_SelectsDefaultEntry()
+        {
+            Assert.That(view.ProcessModel.SelectedItem, Is.EqualTo("Default"));
+        }
+
+        [Test]
+        public void ProcessModel_LoadFromModel_SetsOptionsCorrectly()
+        {
+            Assert.That(view.ProcessModel.SelectionList, Is.EqualTo(
+                new string[] { "Default", "Single", "Separate", "Multiple" }));
+        }
+
+        [Test]
+        public void ProcessModel_WhenChanged_UpdatesDomainUsageOptions()
+        {
+            view.ProcessModel.SelectedItem = "Single";
+            Assert.That(view.DomainUsage.SelectionList, Is.EqualTo(
+                new string[] { "Default", "Single", "Multiple" }));
+
+            view.ProcessModel.SelectedItem = "Multiple";
+            Assert.That(view.DomainUsage.SelectionList, Is.EqualTo(
+                new string[] { "Default", "Single" }));
+        }
+
+        [Test]
+        public void ProcessModel_WhenChanged_UpdatesProject()
+        {
+            view.ProcessModel.SelectedItem = "Multiple";
+            Assert.That(model.ProcessModel, Is.EqualTo("Multiple"));
+        }
+
+        [Test]
+        public void ProjectBase_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.ProjectBase.Text, Is.EqualTo(model.EffectiveBasePath));
+        }
+
+        [Test]
+        public void ProjectBase_WhenChanged_UpdatesProject()
+        {
+            view.ProjectBase.Text = "test.nunit";
+
+            view.ProjectBase.Validated += Raise.Event<ActionDelegate>();
+            Assert.That(model.BasePath, Is.EqualTo("test.nunit"));
+        }
+
+        [Test]
+        public void ProjectPath_LoadFromModel_SetsViewCorrectly()
+        {
+            Assert.That(view.ProjectPath.Text, Is.EqualTo(model.ProjectPath));
+        }
+
+        [Test]
+        public void Runtime_LoadFromModel_SetsOptionsCorrectly()
+        {
+            Assert.That(view.Runtime.SelectionList, Is.EqualTo(
+                new string[] { "Any", "Net", "Mono" }));
+        }
+
+        [Test]
+        public void Runtime_LoadFromModel_SelectsAnyRuntime()
+        {
+            Assert.That(view.Runtime.SelectedIndex, Is.EqualTo(0));
+        }
+
+        [Test]
+        public void Runtime_WhenChanged_UpdatesProject()
+        {
+            // Set to non-default values for this test
+            IProjectConfig config = model.Configs[0];
+            config.RuntimeFramework = new RuntimeFramework(RuntimeType.Net, new Version("2.0.50727"));
+
+            view.ConfigList.SelectedIndex = 0;
+            view.Runtime.SelectedItem = "Mono";
+
+            Assert.That(config.RuntimeFramework.Runtime, Is.EqualTo(RuntimeType.Mono));
+            Assert.That(config.RuntimeFramework.Version, Is.EqualTo(new Version("2.0.50727")));
+        }
+
+        [Test]
+        public void RuntimeVersion_LoadFromModel_SetsOptionsCorretly()
+        {
+            Assert.That(view.RuntimeVersion.SelectionList, Is.EqualTo(
+                new string[] { "1.0.3705", "1.1.4322", "2.0.50727", "4.0.21006" }));
+            //Assert.That(xmlView.RuntimeVersion.SelectedItem, Is.EqualTo("2.0.50727"));
+        }
+
+        [Test]
+        public void RuntimeVersion_WhenSelectionChanged_UpdatesProject()
+        {
+            // Set to non-default values for this test
+            IProjectConfig config = model.Configs[0];
+            config.RuntimeFramework = new RuntimeFramework(RuntimeType.Net, new Version("2.0.50727"));
+
+            view.RuntimeVersion.SelectedItem = "4.0.21006";
+
+            Assert.That(config.RuntimeFramework.Runtime, Is.EqualTo(RuntimeType.Net));
+            Assert.That(config.RuntimeFramework.Version, Is.EqualTo(new Version(4, 0, 21006)));
+        }
+
+        public void RuntimeVersion_WhenTextChanged_UpdatesProject()
+        {
+            // Set to non-default values for this test
+            IProjectConfig config = model.Configs[0];
+            config.RuntimeFramework = new RuntimeFramework(RuntimeType.Net, new Version("2.0.50727"));
+
+            view.RuntimeVersion.Text = "4.0";
+
+            Assert.That(config.RuntimeFramework.Runtime, Is.EqualTo(RuntimeType.Net));
+            Assert.That(config.RuntimeFramework.Version, Is.EqualTo(new Version(4, 0)));
+        }
+    }
+}
+#endif
diff --git a/src/ProjectEditor/tests/Presenters/RenameConfigurationPresenterTests.cs b/src/ProjectEditor/tests/Presenters/RenameConfigurationPresenterTests.cs
new file mode 100644
index 0000000..614cb31
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/RenameConfigurationPresenterTests.cs
@@ -0,0 +1,96 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using System.Collections.Generic;
+using NSubstitute;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Presenters
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class RenameConfigurationPresenterTests
+    {
+        IProjectModel model;
+        IRenameConfigurationDialog dlg;
+        RenameConfigurationPresenter presenter;
+
+        [SetUp]
+        public void Initialize()
+        {
+            IProjectDocument doc = new ProjectDocument();
+            doc.LoadXml(NUnitProjectXml.EmptyConfigs);
+            model = new ProjectModel(doc);
+            dlg = Substitute.For<IRenameConfigurationDialog>();
+            presenter = new RenameConfigurationPresenter(model, dlg, "Debug");
+        }
+
+        [Test]
+        public void ConfigurationName_OnLoad_IsSetToOriginalName()
+        {
+            Assert.AreEqual("Debug", dlg.ConfigurationName.Text);
+        }
+
+        [Test]
+        public void ConfigurationName_OnLoad_OriginalNameIsSelected()
+        {
+            dlg.ConfigurationName.Received().Select(0,5);
+        }
+
+        [Test]
+        public void OkButton_OnLoad_IsDisabled()
+        {
+            Assert.False(dlg.OkButton.Enabled);
+        }
+
+        [Test]
+        public void ConfigurationName_WhenSetToNewName_OkButtonIsEnabled()
+        {
+            dlg.ConfigurationName.Text = "New";
+            dlg.ConfigurationName.Changed += Raise.Event<ActionDelegate>();
+
+            Assert.True(dlg.OkButton.Enabled);
+        }
+
+        [Test]
+        public void ConfigurationName_WhenSetToOriginalName_OkButtonIsDisabled()
+        {
+            dlg.ConfigurationName.Text = "Debug";
+            dlg.ConfigurationName.Changed += Raise.Event<ActionDelegate>();
+
+            Assert.False(dlg.OkButton.Enabled);
+        }
+
+        [Test]
+        public void ConfigurationName_WhenCleared_OkButtonIsDisabled()
+        {
+            dlg.ConfigurationName.Text = string.Empty;
+            dlg.ConfigurationName.Changed += Raise.Event<ActionDelegate>();
+
+            Assert.False(dlg.OkButton.Enabled);
+        }
+
+        [Test]
+        public void OkButton_WhenClicked_PerformsRename()
+        {
+            dlg.ConfigurationName.Text = "New";
+            dlg.OkButton.Execute += Raise.Event<CommandDelegate>();
+
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] { "New", "Release" }));
+        }
+
+        [Test]
+        public void Dialog_WhenClosedWithoutClickingOK_LeavesConfigsUnchanged()
+        {
+            dlg.ConfigurationName.Text = "New";
+            dlg.Close();
+
+            Assert.That(model.ConfigNames, Is.EqualTo(new string[] { "Debug", "Release" }));
+        }
+    }
+}
+#endif
diff --git a/src/ProjectEditor/tests/Presenters/SelectionStub.cs b/src/ProjectEditor/tests/Presenters/SelectionStub.cs
new file mode 100644
index 0000000..114ea17
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/SelectionStub.cs
@@ -0,0 +1,151 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using System.Collections.Generic;
+using NUnit.ProjectEditor.ViewElements;
+
+namespace NUnit.ProjectEditor.Tests
+{
+    public class SelectionStub : ISelectionList, IComboBox
+    {
+        private int selectedIndex = -1;
+        private string[] selectionList;
+        private string text;
+
+        public SelectionStub(string name)
+        {
+            this.Name = name;
+        }
+
+        #region IComboBox Members
+
+        public string Text
+        {
+            get { return text; }
+            set 
+            { 
+                text = value;
+
+                int index = IndexOf(text);
+                selectedIndex = index >= 0 ? index : -1;
+
+                if (TextValidated != null)
+                    TextValidated();
+
+                if (SelectionChanged != null)
+                    SelectionChanged();
+            }
+        }
+
+        public event ActionDelegate TextValidated;
+
+        #endregion
+
+        #region ISelectionList Members
+
+        /// <summary>
+        /// Gets or sets the currently selected item
+        /// </summary>
+        public string SelectedItem
+        {
+            get
+            {
+                return selectedIndex >= 0 && selectedIndex < selectionList.Length
+                    ? selectionList[selectedIndex]
+                    : null;
+            }
+            set
+            {
+                int index = IndexOf(value);
+                
+                if (index >= 0)
+                {
+                    text = value;
+                    selectedIndex = index;
+
+                    if (TextValidated != null)
+                        TextValidated();
+
+                    if (SelectionChanged != null)
+                        SelectionChanged();
+                }
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the contents of the selection list
+        /// </summary>
+        public string[] SelectionList 
+        {
+            get { return selectionList; }
+            set
+            {
+                selectionList = value;
+                if (selectionList.Length == 0)
+                    SelectedIndex = -1;
+                else
+                    SelectedIndex = 0;
+            }
+        }
+
+        #endregion
+
+        #region ISelection Members
+
+        /// <summary>
+        /// Gets or sets the index of the currently selected item
+        /// </summary>
+        public int SelectedIndex
+        {
+            get { return selectedIndex; }
+            set 
+            { 
+                selectedIndex = value < 0 || value >= SelectionList.Length ? -1 : value;
+
+                if (SelectionChanged != null)
+                    SelectionChanged();
+            }
+        }
+        
+
+        /// <summary>
+        /// Event raised when the selection is changed by the user
+        /// </summary>
+        public event ActionDelegate SelectionChanged;
+
+        #endregion
+
+        #region IViewElement Members
+
+        /// <summary>
+        /// Gets the name of the element in the xmlView
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Gets or sets the enabled status of the element
+        /// </summary>
+        public bool Enabled { get; set; }
+
+        #endregion 
+
+        #region Helper Methods
+
+        private int IndexOf(string item)
+        {
+            for (int index = 0; index < selectionList.Length; index++)
+                if (item == selectionList[index])
+                    return index;
+
+            return -1;
+        }
+
+        #endregion
+    }
+}
+#endif
diff --git a/src/ProjectEditor/tests/Presenters/XmlPresenterTests.cs b/src/ProjectEditor/tests/Presenters/XmlPresenterTests.cs
new file mode 100644
index 0000000..be51ea9
--- /dev/null
+++ b/src/ProjectEditor/tests/Presenters/XmlPresenterTests.cs
@@ -0,0 +1,64 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#if NET_3_5 || NET_4_0
+using System;
+using System.Xml;
+using NUnit.Framework;
+using NSubstitute;
+
+namespace NUnit.ProjectEditor.Tests.Presenters
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class XmlPresenterTests
+    {
+        private IProjectDocument doc;
+        private IXmlView xmlView;
+        private XmlPresenter presenter;
+
+        private static readonly string initialText = "<NUnitProject />";
+        private static readonly string changedText = "<NUnitProject processModel=\"Separate\" />";
+
+        [SetUp]
+        public void Initialize()
+        {
+            doc = new ProjectDocument();
+            doc.LoadXml(initialText);
+            xmlView = Substitute.For<IXmlView>();
+            presenter = new XmlPresenter(doc, xmlView);
+            presenter.LoadViewFromModel();
+        }
+
+        [Test]
+        public void XmlText_OnLoad_IsInitializedCorrectly()
+        {
+            Assert.AreEqual(initialText, xmlView.Xml.Text);
+        }
+
+        [Test]
+        public void XmlText_WhenChanged_ModelIsUpdated()
+        {
+            xmlView.Xml.Text = changedText;
+            xmlView.Xml.Validated += Raise.Event<ActionDelegate>();
+            Assert.AreEqual(changedText, doc.XmlText);
+        }
+
+        [Test]
+        public void BadXmlSetsException()
+        {
+            xmlView.Xml.Text = "<NUnitProject>"; // Missing slash
+            xmlView.Xml.Validated += Raise.Event<ActionDelegate>();
+            
+            Assert.AreEqual("<NUnitProject>", doc.XmlText);
+            Assert.NotNull(doc.Exception);
+            Assert.IsInstanceOf<XmlException>(doc.Exception);
+
+            XmlException ex = doc.Exception as XmlException;
+            xmlView.Received().DisplayError(ex.Message, ex.LineNumber, ex.LinePosition);
+        }
+    }
+}
+#endif
diff --git a/src/ProjectEditor/tests/Properties/AssemblyInfo.cs b/src/ProjectEditor/tests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..07cff91
--- /dev/null
+++ b/src/ProjectEditor/tests/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("tests")]
+[assembly: AssemblyCopyright("Copyright ©  2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("6500d115-76e1-4bdd-b765-b3765b783c15")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/ProjectEditor/tests/Views/AddConfigurationDialogTests.cs b/src/ProjectEditor/tests/Views/AddConfigurationDialogTests.cs
new file mode 100644
index 0000000..ad1156a
--- /dev/null
+++ b/src/ProjectEditor/tests/Views/AddConfigurationDialogTests.cs
@@ -0,0 +1,89 @@
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.ProjectEditor.Tests.Views
+{
+	[TestFixture]
+	public class AddConfigurationDialogTests : FormTester
+	{
+		private AddConfigurationDialog dlg;
+
+		[SetUp]
+		public void SetUp()
+		{
+            dlg = new AddConfigurationDialog();
+            dlg.ConfigList = new string[] { "Debug", "Release" };
+            this.Form = dlg;
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			dlg.Close();
+		}
+
+        [Test]
+        public void CheckForControls()
+        {
+            AssertControlExists("configurationNameTextBox", typeof(TextBox));
+            AssertControlExists("configurationComboBox", typeof(ComboBox));
+            AssertControlExists("okButton", typeof(Button));
+            AssertControlExists("cancelButton", typeof(Button));
+        }
+
+        [Test]
+        public void TextBox_OnLoad_IsEmpty()
+        {
+            TextBox configBox = TextBoxes["configurationNameTextBox"];
+            Assert.AreEqual("", configBox.Text);
+        }
+
+        [Test]
+        public void ComboBox_OnLoad_IsInitializedCorrectly()
+        {
+            ComboBox combo = Combos["configurationComboBox"];
+            dlg.Show();
+            Assert.AreEqual(3, combo.Items.Count);
+            Assert.AreEqual("<none>", combo.Items[0]);
+            Assert.AreEqual("Debug", combo.Items[1]);
+            Assert.AreEqual("Release", combo.Items[2]);
+            Assert.AreEqual("<none>", combo.SelectedItem);
+        }
+
+        [Test]
+        public void TestSimpleEntry()
+        {
+            dlg.Show();
+            TextBox config = TextBoxes["configurationNameTextBox"];
+            Button okButton = Buttons["okButton"];
+            config.Text = "Super";
+            okButton.PerformClick();
+            Assert.AreEqual("Super", dlg.ConfigToCreate);
+            Assert.AreEqual(null, dlg.ConfigToCopy);
+        }
+
+        [Test]
+        public void TestComplexEntry()
+        {
+            dlg.Show();
+            TextBox config = TextBoxes["configurationNameTextBox"];
+            Button okButton = Buttons["okButton"];
+            ComboBox combo = Combos["configurationComboBox"];
+
+            config.Text = "Super";
+            combo.SelectedIndex = combo.FindStringExact("Release");
+
+            okButton.PerformClick();
+            Assert.AreEqual("Super", dlg.ConfigToCreate);
+            Assert.AreEqual("Release", dlg.ConfigToCopy);
+        }
+	}
+}
diff --git a/src/ProjectEditor/tests/Views/ConfigurationEditorViewTests.cs b/src/ProjectEditor/tests/Views/ConfigurationEditorViewTests.cs
new file mode 100644
index 0000000..013b370
--- /dev/null
+++ b/src/ProjectEditor/tests/Views/ConfigurationEditorViewTests.cs
@@ -0,0 +1,27 @@
+// ****************************************************************
+// 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.ProjectEditor.Tests.Views
+{
+    public class ConfigurationEditorViewTests
+    {
+        [Test]
+        public void AllViewElementsAreWrapped()
+        {
+            ConfigurationEditorDialog view = new ConfigurationEditorDialog();
+
+            Assert.NotNull(view.AddCommand);
+            Assert.NotNull(view.RemoveCommand);
+            Assert.NotNull(view.RenameCommand);
+            Assert.NotNull(view.ActiveCommand);
+
+            Assert.NotNull(view.ConfigList);
+        }
+    }
+}
diff --git a/src/ProjectEditor/tests/Views/PropertyViewTests.cs b/src/ProjectEditor/tests/Views/PropertyViewTests.cs
new file mode 100644
index 0000000..5c85bd2
--- /dev/null
+++ b/src/ProjectEditor/tests/Views/PropertyViewTests.cs
@@ -0,0 +1,30 @@
+// ****************************************************************
+// 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.Reflection;
+using NUnit.Framework;
+
+namespace NUnit.ProjectEditor.Tests.Views
+{
+    public class PropertyViewTests
+    {
+        [Test]
+        public void AllViewElementsAreInitialized()
+        {
+            PropertyView view = new PropertyView();
+
+            foreach (PropertyInfo prop in typeof(PropertyView).GetProperties())
+            {
+                if (typeof(IViewElement).IsAssignableFrom(prop.PropertyType))
+                {
+                    if (prop.GetValue(view, new object[0]) == null)
+                        Assert.Fail("{0} was not initialized", prop.Name);
+                }
+            }
+        }
+    }
+}
diff --git a/src/ProjectEditor/tests/nunit-editor.tests.build b/src/ProjectEditor/tests/nunit-editor.tests.build
new file mode 100644
index 0000000..a60e6e6
--- /dev/null
+++ b/src/ProjectEditor/tests/nunit-editor.tests.build
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<project name="NUnitEditorTests" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Properties/AssemblyInfo.cs"/>
+    <include name="FormTester.cs"/>
+    <include name="NUnitProjectXml.cs"/>
+    <include name="Model/AssemblyListTests.cs"/>
+    <include name="Model/NUnitProjectSave.cs"/>
+    <include name="Model/ProjectCreationTests.cs"/>
+    <include name="Model/ProjectDocumentTests.cs"/>
+    <include name="Model/ProjectModelChangeTests.cs"/>
+    <include name="Model/ProjectModelLoadTests.cs"/>
+    <include name="Presenters/AddConfigurationPresenterTests.cs"/>
+    <include name="Presenters/ConfigurationEditorTests.cs"/>
+    <include name="Presenters/MainPresenterTests.cs"/>
+    <include name="Presenters/PropertyPresenterTests.cs"/>
+    <include name="Presenters/RenameConfigurationPresenterTests.cs"/>
+    <include name="Presenters/SelectionStub.cs"/>
+    <include name="Presenters/XmlPresenterTests.cs"/>
+    <include name="Views/AddConfigurationDialogTests.cs"/>
+    <include name="Views/ConfigurationEditorViewTests.cs"/>
+    <include name="Views/PropertyViewTests.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="resources/*"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit-editor.tests.dll"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <resources prefix="NUnit.ProjectEditor.Tests.resources">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.Windows.Forms.dll"/>
+	      <include name="System.Drawing.dll"/>
+        <include name="System.Xml.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/NSubstitute.dll" if="${runtime.version >= '3.5'}"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+        <include name="${current.build.dir}/nunit-editor.exe"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/ProjectEditor/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit-editor.tests.csproj"/>
+        <include name="nunit-editor.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/ProjectEditor/tests/nunit-editor.tests.csproj b/src/ProjectEditor/tests/nunit-editor.tests.csproj
new file mode 100644
index 0000000..850da0a
--- /dev/null
+++ b/src/ProjectEditor/tests/nunit-editor.tests.csproj
@@ -0,0 +1,96 @@
+<?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.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A9E1C1E9-AE97-4510-AD94-EAFADE425FBE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NUnit.ProjectEditor.Tests</RootNamespace>
+    <AssemblyName>nunit-editor.tests</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</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;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="NSubstitute">
+      <HintPath>..\..\..\lib\3.5\NSubstitute.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Model\AssemblyListTests.cs" />
+    <Compile Include="Model\ProjectDocumentTests.cs" />
+    <Compile Include="Model\ProjectCreationTests.cs" />
+    <Compile Include="Model\NUnitProjectSave.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Model\ProjectModelChangeTests.cs" />
+    <Compile Include="Model\ProjectModelLoadtests.cs" />
+    <Compile Include="NUnitProjectXml.cs" />
+    <Compile Include="Presenters\AddConfigurationPresenterTests.cs" />
+    <Compile Include="Presenters\ConfigurationEditorTests.cs" />
+    <Compile Include="Presenters\MainPresenterTests.cs" />
+    <Compile Include="Presenters\PropertyPresenterTests.cs" />
+    <Compile Include="Presenters\RenameConfigurationPresenterTests.cs" />
+    <Compile Include="Presenters\SelectionStub.cs" />
+    <Compile Include="Presenters\XmlPresenterTests.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Views\AddConfigurationDialogTests.cs" />
+    <Compile Include="Views\ConfigurationEditorViewTests.cs" />
+    <Compile Include="Views\PropertyViewTests.cs" />
+  </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="..\..\tests\test-utilities\test-utilities.csproj">
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+      <Name>test-utilities</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\editor\nunit-editor.csproj">
+      <Project>{ED57DCEC-3C16-4A90-BD3C-4D5BE5AD70FB}</Project>
+      <Name>nunit-editor</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\BadProject.nunit" />
+    <EmbeddedResource Include="resources\NUnitTests.nunit" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-editor.tests.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\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/ProjectEditor/tests/resources/BadProject.nunit b/src/ProjectEditor/tests/resources/BadProject.nunit
new file mode 100644
index 0000000..1f2408f
--- /dev/null
+++ b/src/ProjectEditor/tests/resources/BadProject.nunit
@@ -0,0 +1,25 @@
+<NUnitProject>
+  <Settings activeconfig="Debug" autoconfig="true" appbase="D:\Dev\NUnit\nunit-2.6\work" processModel="Default" domainUsage="Default" />
+  <Config name="Debug" binpathtype="Manual" runtimeFramework="v2.0.50727" appbase="" binpath="bin/Debug/lib;bin/Debug/tests;bin/Debug/framework">
+    <assembly path="bin/Debug/nunit.framework.tests.dll" />
+    <assembly path="bin/Debug/nunit.core.tests.dll" />
+    <assembly path="bin/Debug/nunit.util.tests.dll" />
+    <assembly path="bin/Debug/nunit.mocks.tests.dll" />
+    <assembly path="bin/Debug/nunit-console.tests.dll" />
+    <assembly path="bin/Debug/nunit.uikit.tests.dll" />
+    <assembly path="bin/Debug/nunit.uiexception.tests.dll" >  <!-- note missing slash -->
+    <assembly path="bin/Debug/nunit-gui.tests.dll" />
+    <assembly path="bin/Debug/nunit.fixtures.tests.dll" />
+  </Config>
+  <Config name="Release" binpath="bin/Release/lib;bin/Release/tests;bin/Release/framework" binpathtype="Manual">
+    <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/src/ProjectEditor/tests/resources/NUnitTests.nunit b/src/ProjectEditor/tests/resources/NUnitTests.nunit
new file mode 100644
index 0000000..a9082d2
--- /dev/null
+++ b/src/ProjectEditor/tests/resources/NUnitTests.nunit
@@ -0,0 +1,25 @@
+<NUnitProject>
+  <Settings activeconfig="Debug" autoconfig="true" appbase="D:\Dev\NUnit\nunit-2.6\work" processModel="Default" domainUsage="Default" />
+  <Config name="Debug" binpathtype="Manual" runtimeFramework="v2.0.50727" appbase="" binpath="bin/Debug/lib;bin/Debug/tests;bin/Debug/framework">
+    <assembly path="bin/Debug/nunit.framework.tests.dll" />
+    <assembly path="bin/Debug/nunit.core.tests.dll" />
+    <assembly path="bin/Debug/nunit.util.tests.dll" />
+    <assembly path="bin/Debug/nunit.mocks.tests.dll" />
+    <assembly path="bin/Debug/nunit-console.tests.dll" />
+    <assembly path="bin/Debug/nunit.uikit.tests.dll" />
+    <assembly path="bin/Debug/nunit.uiexception.tests.dll" />
+    <assembly path="bin/Debug/nunit-gui.tests.dll" />
+    <assembly path="bin/Debug/nunit.fixtures.tests.dll" />
+  </Config>
+  <Config name="Release" binpath="bin/Release/lib;bin/Release/tests;bin/Release/framework" binpathtype="Manual">
+    <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/src/tests/loadtest-assembly/AAA/Class1.cs b/src/tests/loadtest-assembly/AAA/Class1.cs
deleted file mode 100644
index af14776..0000000
--- a/src/tests/loadtest-assembly/AAA/Class1.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.AAA
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-	public class Class1 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/AAA/Class2.cs b/src/tests/loadtest-assembly/AAA/Class2.cs
deleted file mode 100644
index 7e94f5c..0000000
--- a/src/tests/loadtest-assembly/AAA/Class2.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.AAA
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class2 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/AAA/Class3.cs b/src/tests/loadtest-assembly/AAA/Class3.cs
deleted file mode 100644
index 531b032..0000000
--- a/src/tests/loadtest-assembly/AAA/Class3.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.AAA
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class3 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/AAA/Class4.cs b/src/tests/loadtest-assembly/AAA/Class4.cs
deleted file mode 100644
index a56505f..0000000
--- a/src/tests/loadtest-assembly/AAA/Class4.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.AAA
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class4 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/AAA/Class5.cs b/src/tests/loadtest-assembly/AAA/Class5.cs
deleted file mode 100644
index d8f020b..0000000
--- a/src/tests/loadtest-assembly/AAA/Class5.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.AAA
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class5 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/BBB/Class1.cs b/src/tests/loadtest-assembly/BBB/Class1.cs
deleted file mode 100644
index 477c817..0000000
--- a/src/tests/loadtest-assembly/BBB/Class1.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.BBB
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class1 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/BBB/Class2.cs b/src/tests/loadtest-assembly/BBB/Class2.cs
deleted file mode 100644
index aa923e1..0000000
--- a/src/tests/loadtest-assembly/BBB/Class2.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.BBB
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class2 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/BBB/Class3.cs b/src/tests/loadtest-assembly/BBB/Class3.cs
deleted file mode 100644
index f63788f..0000000
--- a/src/tests/loadtest-assembly/BBB/Class3.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.BBB
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class3 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/BBB/Class4.cs b/src/tests/loadtest-assembly/BBB/Class4.cs
deleted file mode 100644
index 2360a59..0000000
--- a/src/tests/loadtest-assembly/BBB/Class4.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.BBB
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class4 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/BBB/Class5.cs b/src/tests/loadtest-assembly/BBB/Class5.cs
deleted file mode 100644
index 848c518..0000000
--- a/src/tests/loadtest-assembly/BBB/Class5.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.BBB
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class5 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/BaseClass.cs b/src/tests/loadtest-assembly/BaseClass.cs
deleted file mode 100644
index a6a1597..0000000
--- a/src/tests/loadtest-assembly/BaseClass.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-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
deleted file mode 100644
index 974ddf4..0000000
--- a/src/tests/loadtest-assembly/CCC/Class1.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.CCC
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class1 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/CCC/Class2.cs b/src/tests/loadtest-assembly/CCC/Class2.cs
deleted file mode 100644
index 8b6d202..0000000
--- a/src/tests/loadtest-assembly/CCC/Class2.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.CCC
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class2 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/CCC/Class3.cs b/src/tests/loadtest-assembly/CCC/Class3.cs
deleted file mode 100644
index 3d71897..0000000
--- a/src/tests/loadtest-assembly/CCC/Class3.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.CCC
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class3 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/CCC/Class4.cs b/src/tests/loadtest-assembly/CCC/Class4.cs
deleted file mode 100644
index e50073b..0000000
--- a/src/tests/loadtest-assembly/CCC/Class4.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.CCC
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class4 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/CCC/Class5.cs b/src/tests/loadtest-assembly/CCC/Class5.cs
deleted file mode 100644
index 27db264..0000000
--- a/src/tests/loadtest-assembly/CCC/Class5.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.CCC
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class5 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/DDD/Class1.cs b/src/tests/loadtest-assembly/DDD/Class1.cs
deleted file mode 100644
index e33d7a4..0000000
--- a/src/tests/loadtest-assembly/DDD/Class1.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.DDD
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class1 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/DDD/Class2.cs b/src/tests/loadtest-assembly/DDD/Class2.cs
deleted file mode 100644
index 13e7697..0000000
--- a/src/tests/loadtest-assembly/DDD/Class2.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.DDD
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class2 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/DDD/Class3.cs b/src/tests/loadtest-assembly/DDD/Class3.cs
deleted file mode 100644
index 2a55dca..0000000
--- a/src/tests/loadtest-assembly/DDD/Class3.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.DDD
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class3 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/DDD/Class4.cs b/src/tests/loadtest-assembly/DDD/Class4.cs
deleted file mode 100644
index 7361ba4..0000000
--- a/src/tests/loadtest-assembly/DDD/Class4.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.DDD
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class4 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/DDD/Class5.cs b/src/tests/loadtest-assembly/DDD/Class5.cs
deleted file mode 100644
index 26433c5..0000000
--- a/src/tests/loadtest-assembly/DDD/Class5.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-// ****************************************************************
-// 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.Tests.Assemblies.DDD
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	[TestFixture]
-    public class Class5 : BaseClass
-	{
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-
-		[Test]
-		public void Test3() { }
-
-		[Test]
-		public void Test4() { }
-
-		[Test]
-		public void Test5() { }
-
-		[Test]
-		public void Test6() { }
-
-		[Test]
-		public void Test7() { }
-
-		[Test]
-		public void Test8() { }
-
-		[Test]
-		public void Test9() { }
-
-		[Test]
-		public void Test10() { }
-
-		[Test]
-		public void Test11() { }
-
-		[Test]
-		public void Test12() { }
-
-		[Test]
-		public void Test13() { }
-
-		[Test]
-		public void Test14() { }
-
-		[Test]
-		public void Test15() { }
-
-		[Test]
-		public void Test16() { }
-
-		[Test]
-		public void Test17() { }
-
-		[Test]
-		public void Test18() { }
-
-		[Test]
-		public void Test19() { }
-
-		[Test]
-		public void Test20() { }
-
-		[Test]
-		public void Test21() { }
-
-		[Test]
-		public void Test22() { }
-
-		[Test]
-		public void Test23() { }
-
-		[Test]
-		public void Test24() { }
-
-		[Test]
-		public void Test25() { }
-
-		[Test]
-		public void Test26() { }
-
-		[Test]
-		public void Test27() { }
-
-		[Test]
-		public void Test28() { }
-
-		[Test]
-		public void Test29() { }
-
-		[Test]
-		public void Test30() { }
-
-		[Test]
-		public void Test31() { }
-
-		[Test]
-		public void Test32() { }
-
-		[Test]
-		public void Test33() { }
-
-		[Test]
-		public void Test34() { }
-
-		[Test]
-		public void Test35() { }
-
-		[Test]
-		public void Test36() { }
-
-		[Test]
-		public void Test37() { }
-
-		[Test]
-		public void Test38() { }
-
-		[Test]
-		public void Test39() { }
-
-		[Test]
-		public void Test40() { }
-
-		[Test]
-		public void Test41() { }
-
-		[Test]
-		public void Test42() { }
-
-		[Test]
-		public void Test43() { }
-
-		[Test]
-		public void Test44() { }
-
-		[Test]
-		public void Test45() { }
-
-		[Test]
-		public void Test46() { }
-
-		[Test]
-		public void Test47() { }
-
-		[Test]
-		public void Test48() { }
-
-		[Test]
-		public void Test49() { }
-
-		[Test]
-		public void Test50() { }
-
-	}
-}
diff --git a/src/tests/loadtest-assembly/loadtest-assembly.build b/src/tests/loadtest-assembly/loadtest-assembly.build
deleted file mode 100644
index 92f45d4..0000000
--- a/src/tests/loadtest-assembly/loadtest-assembly.build
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<project name="LoadTestAssembly" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/loadtest-assembly.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="**/*.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618,672"/>
-      </nowarn>
-      <references basedir="${current.framework.dir}">
-        <include name="nunit.framework.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/tests/loadtest-assembly">
-      <fileset>
-        <include name="**/*.cs"/>
-        <include name="loadtest-assembly.csproj"/>
-        <include name="loadtest-assembly.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/tests/loadtest-assembly/loadtest-assembly.csproj b/src/tests/loadtest-assembly/loadtest-assembly.csproj
deleted file mode 100644
index 45f23fb..0000000
--- a/src/tests/loadtest-assembly/loadtest-assembly.csproj
+++ /dev/null
@@ -1,86 +0,0 @@
-<?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/mock-assembly/MockAssembly.cs b/src/tests/mock-assembly/MockAssembly.cs
index 24c147c..fb7eb1e 100644
--- a/src/tests/mock-assembly/MockAssembly.cs
+++ b/src/tests/mock-assembly/MockAssembly.cs
@@ -15,8 +15,8 @@ namespace NUnit.Tests
 		/// Constant definitions for the mock-assembly dll.
 		/// </summary>
 		public class MockAssembly
-		{
-#if NET_2_0
+        {
+#if CLR_2_0 || CLR_4_0
             public static int Classes = 9;
 #else
             public static int Classes = 8;
@@ -237,9 +237,9 @@ namespace NUnit.Tests
 	
 	[TestFixture]
 	public class FixtureWithTestCases
-	{
-#if NET_2_0
-		public static readonly int Tests = 4;
+    {
+#if CLR_2_0 || CLR_4_0
+        public static readonly int Tests = 4;
 		public static readonly int Suites = 3;
 #else
 		public static readonly int Tests = 2;
@@ -251,10 +251,10 @@ namespace NUnit.Tests
 		public int MethodWithParameters(int x, int y)
 		{
 			return x+y;
-		}
+        }
 
-#if NET_2_0
-		[TestCase(2, 4)]
+#if CLR_2_0 || CLR_4_0
+        [TestCase(2, 4)]
 		[TestCase(9.2, 11.7)]
 		public void GenericMethod<T>(T x, T y)
 		{
@@ -279,18 +279,18 @@ namespace NUnit.Tests
 	}
 	
 	public class GenericFixtureConstants
-	{
-#if NET_2_0
-		public static readonly int Tests = 4;
+    {
+#if CLR_2_0 || CLR_4_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)]
+    }
+
+#if CLR_2_0 || CLR_4_0
+    [TestFixture(5)]
 	[TestFixture(11.5)]
 	public class GenericFixture<T>
 	{
diff --git a/src/tests/mock-assembly/mock-assembly.csproj b/src/tests/mock-assembly/mock-assembly.csproj
index 7a3788f..3e35378 100644
--- a/src/tests/mock-assembly/mock-assembly.csproj
+++ b/src/tests/mock-assembly/mock-assembly.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -46,7 +46,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -78,9 +78,8 @@
       <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>
+      <Name>nunit.framework.dll</Name>
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
diff --git a/src/tests/nonamespace-assembly/nonamespace-assembly.csproj b/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
index d79a0be..02859a8 100644
--- a/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
+++ b/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
diff --git a/src/tests/test-assembly/ActionAttributeExceptionFixture.cs b/src/tests/test-assembly/ActionAttributeExceptionFixture.cs
new file mode 100644
index 0000000..813640c
--- /dev/null
+++ b/src/tests/test-assembly/ActionAttributeExceptionFixture.cs
@@ -0,0 +1,86 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Reflection;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [ExceptionThrowingAction]
+    [TestFixture]
+    public class ActionAttributeExceptionFixture
+    {
+        public static bool SetUpRun = false;
+        public static bool TestRun = false;
+        public static bool TearDownRun = false;
+
+        public static void Reset()
+        {
+            SetUpRun = false;
+            TestRun = false;
+            TearDownRun = false;
+        }
+
+        [SetUp]
+        public void SetUp()
+        {
+            SetUpRun = true;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            TearDownRun = true;
+        }
+
+        [ExceptionThrowingAction]
+        [Test]
+        public void SomeTest()
+        {
+            TestRun = true;
+        }
+    }
+
+    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
+    public class ExceptionThrowingActionAttribute : TestActionAttribute
+    {
+        private static bool _ThrowBeforeException;
+        private static bool _ThrowAfterException;
+
+        public static void Reset()
+        {
+            ThrowBeforeException = false;
+            ThrowAfterException = false;
+        }
+
+        public override void BeforeTest(TestDetails testDetails)
+        {
+            if (ThrowBeforeException)
+                throw new InvalidOperationException("Failure in BeforeTest.");
+        }
+
+        public override void AfterTest(TestDetails testDetails)
+        {
+            if (ThrowAfterException)
+                throw new InvalidOperationException("Failure in AfterTest.");
+        }
+
+        public static bool ThrowBeforeException
+        {
+            get { return _ThrowBeforeException; }
+            set { _ThrowBeforeException = value; }
+        }
+
+        public static bool ThrowAfterException
+        {
+            get { return _ThrowAfterException; }
+            set { _ThrowAfterException = value; }
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/src/tests/test-assembly/ActionAttributeFixture.cs b/src/tests/test-assembly/ActionAttributeFixture.cs
new file mode 100644
index 0000000..b614e49
--- /dev/null
+++ b/src/tests/test-assembly/ActionAttributeFixture.cs
@@ -0,0 +1,138 @@
+// ****************************************************************
+// Copyright 2012, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+using System.Diagnostics;
+using System.Reflection;
+using NUnit.TestData.ActionAttributeTests;
+
+[assembly: SampleAction("AssemblySuite", ActionTargets.Suite)]
+[assembly: SampleAction("AssemblyTest", ActionTargets.Test)]
+[assembly: SampleAction("AssemblySite")]
+
+namespace NUnit.TestData.ActionAttributeTests
+{
+    [SetUpFixture]
+    [SampleAction("SetupFixtureSuite", ActionTargets.Suite)]
+    [SampleAction("SetupFixtureTest", ActionTargets.Test)]
+    [SampleAction("SetupFixtureSite")]
+    public class SetupFixture : BaseSetupFixture
+    {
+    }
+
+    [SampleAction("BaseSetupFixtureSuite", ActionTargets.Suite)]
+    [SampleAction("BaseSetupFixtureTest", ActionTargets.Test)]
+    [SampleAction("BaseSetupFixtureSite")]
+    public abstract class BaseSetupFixture
+    {
+    }
+
+    [TestFixture]
+    [SampleAction("FixtureSuite", ActionTargets.Suite)]
+    [SampleAction("FixtureTest", ActionTargets.Test)]
+    [SampleAction("FixtureSite")]
+    public class ActionAttributeFixture : BaseActionAttributeFixture, IWithAction
+    {
+        private static List<string> _Results = null;
+        public static List<string> Results
+        {
+            get { return _Results; }
+            set { _Results = value; }
+        }
+
+        List<string> IWithAction.Results { get { return Results; } }
+
+        // NOTE: Both test cases use the same message because
+        // order of execution is indeterminate.
+        [Test, TestCase("SomeTest"), TestCase("SomeTest")]
+        [SampleAction("ParameterizedSuite", ActionTargets.Suite)]
+        [SampleAction("ParameterizedTest", ActionTargets.Test)]
+        [SampleAction("ParameterizedSite")]
+        public void SomeTest(string message)
+        {
+            ((IWithAction)this).Results.Add(message);
+        }
+
+        [Test]
+        [SampleAction("MethodSuite", ActionTargets.Suite)] // should never get invoked
+        [SampleAction("MethodTest", ActionTargets.Test)]
+        [SampleAction("MethodSite")]
+        public void SomeTestNotParameterized()
+        {
+            ((IWithAction)this).Results.Add("SomeTestNotParameterized");
+        }
+    }
+
+    [SampleAction("BaseFixtureSuite", ActionTargets.Suite)]
+    [SampleAction("BaseFixtureTest", ActionTargets.Test)]
+    [SampleAction("BaseFixtureSite")]
+    public abstract class BaseActionAttributeFixture : IBaseWithAction
+    {
+    }
+
+    [SampleAction("InterfaceSuite", ActionTargets.Suite)]
+    [SampleAction("InterfaceTest", ActionTargets.Test)]
+    [SampleAction("InterfaceSite")]
+    public interface IWithAction
+    {
+        List<string> Results { get; }
+    }
+
+    [SampleAction("BaseInterfaceSuite", ActionTargets.Suite)]
+    [SampleAction("BaseInterfaceTest", ActionTargets.Test)]
+    [SampleAction("BaseInterfaceSite")]
+    public interface IBaseWithAction
+    {
+    }
+
+    public class SampleActionAttribute : TestActionAttribute
+    {
+        private readonly string _Prefix = null;
+        private readonly ActionTargets _Targets = ActionTargets.Default;
+
+        public SampleActionAttribute(string prefix)
+        {
+            _Prefix = prefix;
+        }
+
+        public SampleActionAttribute(string prefix, ActionTargets targets)
+        {
+            _Prefix = prefix;
+            _Targets = targets;
+        }
+
+        public override void BeforeTest(TestDetails testDetails)
+        {
+            AddResult("Before", testDetails);
+        }
+
+        public override void AfterTest(TestDetails testDetails)
+        {
+            AddResult("After", testDetails);
+        }
+
+        public override ActionTargets Targets
+        {
+            get { return _Targets; }
+        }
+
+        private void AddResult(string phase, TestDetails testDetails)
+        {
+            string message = string.Format("{0}.{1}.{2}.{3}",
+                                           _Prefix,
+                                           phase,
+                                           testDetails.Fixture != null ? "true" : "false",
+                                           testDetails.Method != null ? "true" : "false");
+
+            if(ActionAttributeFixture.Results != null)
+                ActionAttributeFixture.Results.Add(message);
+        }
+    }
+}
+#endif
diff --git a/src/tests/test-assembly/DatapointFixture.cs b/src/tests/test-assembly/DatapointFixture.cs
index b387106..321e9db 100644
--- a/src/tests/test-assembly/DatapointFixture.cs
+++ b/src/tests/test-assembly/DatapointFixture.cs
@@ -1,6 +1,12 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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;
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 
@@ -44,7 +50,7 @@ namespace NUnit.TestData.DatapointFixture
         public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
     }
 
-#if NET_2_0 && CS_3_0
+#if CS_3_0 || CS_4_0
     public class SquareRootTest_Field_IEnumerableOfDouble : SquareRootTest
     {
         [Datapoints]
@@ -68,6 +74,19 @@ namespace NUnit.TestData.DatapointFixture
             return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
         }
     }
+
+    public class SquareRootTest_Iterator_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> GetValues()
+        {
+            yield return 0.0;
+            yield return 1.0;
+            yield return -1.0;
+            yield return double.MaxValue;
+            yield return double.PositiveInfinity;
+        }
+    }
 #endif
 
     public class SquareRootTest_Property_ArrayOfDouble : SquareRootTest
diff --git a/src/tests/test-assembly/FixtureSetUpTearDownTests.cs b/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
index a21151d..871869c 100644
--- a/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
+++ b/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
@@ -168,7 +168,7 @@ namespace NUnit.TestData.FixtureSetUpTearDown
         }
     }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     [TestFixture]
     public static class StaticClassSetUpAndTearDownFixture
     {
diff --git a/src/tests/test-assembly/ParameterizedTestFixture.cs b/src/tests/test-assembly/ParameterizedTestFixture.cs
index 618aae1..bc1fae5 100644
--- a/src/tests/test-assembly/ParameterizedTestFixture.cs
+++ b/src/tests/test-assembly/ParameterizedTestFixture.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
diff --git a/src/tests/test-assembly/TestCaseAttributeFixture.cs b/src/tests/test-assembly/TestCaseAttributeFixture.cs
index da79520..67b678c 100644
--- a/src/tests/test-assembly/TestCaseAttributeFixture.cs
+++ b/src/tests/test-assembly/TestCaseAttributeFixture.cs
@@ -73,5 +73,12 @@ namespace NUnit.TestData
         public void MethodWithIgnoredTestCases(int num)
         {
         }
+
+        [TestCase(1)]
+        [TestCase(2, Explicit = true)]
+        [TestCase(3, Explicit = true, Reason = "Connection failing")]
+        public void MethodWithExplicitTestCases(int num)
+        {
+        }
     }
 }
diff --git a/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs b/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
index 6ace9f9..7a06aca 100644
--- a/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
+++ b/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
@@ -30,6 +30,12 @@ namespace NUnit.TestData
         }
 
         [TestCaseSource("source")]
+        public string MethodThrowsNoExceptionButReturnsResult(int x, int y, int z)
+        {
+            return "HELLO";
+        }
+
+        [TestCaseSource("source")]
         public void MethodCallsIgnore(int x, int y, int z)
         {
             Assert.Ignore("Ignore this");
@@ -48,6 +54,11 @@ namespace NUnit.TestData
         {
         }
 
+        [TestCaseSource("explicit_source")]
+        public void MethodWithExplicitTestCases(int num)
+        {
+        }
+
         private static IEnumerable ignored_source
         {
             get
@@ -60,11 +71,23 @@ namespace NUnit.TestData
             }
         }
 
+        private static IEnumerable explicit_source
+        {
+            get
+            {
+                return new object[] {
+                    new TestCaseData(1),
+                    new TestCaseData(2).MakeExplicit(),
+                    new TestCaseData(3).MakeExplicit("Connection failing")
+                };
+            }
+        }
+
         private static IEnumerable exception_source
         {
             get
             {
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
                 yield return new TestCaseData("a", "a");
                 yield return new TestCaseData("b", "b");
 #endif
diff --git a/src/tests/test-assembly/TestContextData.cs b/src/tests/test-assembly/TestContextData.cs
index 5ce51c2..8b69a52 100644
--- a/src/tests/test-assembly/TestContextData.cs
+++ b/src/tests/test-assembly/TestContextData.cs
@@ -1,4 +1,10 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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.TestContextData
diff --git a/src/tests/test-assembly/TestFixtureData.cs b/src/tests/test-assembly/TestFixtureData.cs
index 2c767ac..e5be561 100644
--- a/src/tests/test-assembly/TestFixtureData.cs
+++ b/src/tests/test-assembly/TestFixtureData.cs
@@ -43,13 +43,31 @@ namespace NUnit.TestData.TestFixtureData
 		{}
 	}
 
-    public class FixtureWithoutTestFixtureAttribute
+    public class FixtureWithoutTestFixtureAttributeContainingTest
     {
         [Test]
         public void SomeTest() { }
     }
 
-#if NET_2_0
+    public class FixtureWithoutTestFixtureAttributeContainingTestCase
+    {
+        [TestCase(42)]
+        public void SomeTest(int x) { }
+    }
+
+    public class FixtureWithoutTestFixtureAttributeContainingTestCaseSource
+    {
+        [TestCaseSource("data")]
+        public void SomeTest(int x) { }
+    }
+
+    public class FixtureWithoutTestFixtureAttributeContainingTheory
+    {
+        [Theory]
+        public void SomeTest(int x) { }
+    }
+
+#if CLR_2_0 || CLR_4_0
     public static class StaticFixtureWithoutTestFixtureAttribute
     {
         [Test]
@@ -335,9 +353,9 @@ namespace NUnit.TestData.TestFixtureData
 	{
 		[TestFixtureTearDown]
 		public void Teardown(int j) { }
-	}
+    }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     [TestFixture(typeof(int))]
     [TestFixture(typeof(string))]
     public class GenericFixtureWithProperArgsProvided<T>
diff --git a/src/tests/test-assembly/ThreadingFixture.cs b/src/tests/test-assembly/ThreadingFixture.cs
index cf8d1ce..e1f4778 100644
--- a/src/tests/test-assembly/ThreadingFixture.cs
+++ b/src/tests/test-assembly/ThreadingFixture.cs
@@ -11,6 +11,20 @@ namespace NUnit.TestData
     [TestFixture]
     public class ThreadingFixture
     {
+        public bool TearDownWasRun;
+
+        [SetUp]
+        public void SetUp()
+        {
+            TearDownWasRun = false;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            TearDownWasRun = true;
+        }
+
         [Test, Timeout(50)]
         public void InfiniteLoopWith50msTimeout()
         {
diff --git a/src/tests/test-assembly/TypeHelperFixture.cs b/src/tests/test-assembly/TypeHelperFixture.cs
index ff8b1b8..f7f2ab5 100644
--- a/src/tests/test-assembly/TypeHelperFixture.cs
+++ b/src/tests/test-assembly/TypeHelperFixture.cs
@@ -1,6 +1,12 @@
-using System;
+// ****************************************************************
+// Copyright 2012, 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
+#if CLR_2_0 || CLR_4_0
 using System.Collections.Generic;
 #endif
 using NUnit.Framework;
@@ -25,13 +31,13 @@ namespace NUnit.TestData.TypeHelperFixture
             [TestFixture]
             public class DoublyNestedClass { }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
             [TestFixture(typeof(long))]
             public class DoublyNestedGeneric<T> { }
 #endif
         }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
         public class NestedGeneric<T>
         {
             [TestFixture(typeof(int))]
@@ -45,7 +51,7 @@ namespace NUnit.TestData.TypeHelperFixture
 #endif
     }
 
-#if NET_2_0
+#if CLR_2_0 || CLR_4_0
     [TestFixture(typeof(int[]))]
     [TestFixture(typeof(List<int>))]
     [TestFixture(typeof(List<string>))]
diff --git a/src/tests/test-assembly/test-assembly.build b/src/tests/test-assembly/test-assembly.build
index 4730a4c..7e2a4fb 100644
--- a/src/tests/test-assembly/test-assembly.build
+++ b/src/tests/test-assembly/test-assembly.build
@@ -2,6 +2,8 @@
 <project name="TestAssembly" default="build" basedir=".">
 
   <patternset id="source-files">
+    <include name="ActionAttributeExceptionFixture.cs"/>
+    <include name="ActionAttributeFixture.cs"/>
     <include name="AttributeDescriptionTests.cs"/>
     <include name="AttributeInheritance.cs"/>
     <include name="CategoryAttributeTests.cs"/>
diff --git a/src/tests/test-assembly/test-assembly.csproj b/src/tests/test-assembly/test-assembly.csproj
index 937a8ba..a7562d1 100644
--- a/src/tests/test-assembly/test-assembly.csproj
+++ b/src/tests/test-assembly/test-assembly.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -44,7 +44,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0;CS_3_0</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
@@ -62,7 +62,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0</DefineConstants>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <FileAlignment>4096</FileAlignment>
@@ -98,6 +98,10 @@
       <Name>nunit.framework.dll</Name>
       <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
     </ProjectReference>
+    <ProjectReference Include="..\..\PNUnit\pnunit.framework\pnunit.framework.csproj">
+      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
+      <Name>pnunit.framework</Name>
+    </ProjectReference>
     <ProjectReference Include="..\nonamespace-assembly\nonamespace-assembly.csproj">
       <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
       <Name>nonamespace-assembly</Name>
@@ -124,8 +128,10 @@
     <Compile Include="..\..\CommonAssemblyInfo.cs">
       <Link>CommonAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="ActionAttributeExceptionFixture.cs" />
     <Compile Include="AttributeDescriptionTests.cs" />
     <Compile Include="AttributeInheritance.cs" />
+    <Compile Include="ActionAttributeFixture.cs" />
     <Compile Include="CategoryAttributeTests.cs" />
     <Compile Include="ConsoleRunnerTest.cs" />
     <Compile Include="CultureAttributeTests.cs" />
diff --git a/src/tests/test-utilities/TempResourceFile.cs b/src/tests/test-utilities/TempResourceFile.cs
index cc4c94a..1f60312 100644
--- a/src/tests/test-utilities/TempResourceFile.cs
+++ b/src/tests/test-utilities/TempResourceFile.cs
@@ -13,22 +13,29 @@ namespace NUnit.TestUtilities
 	{
 		string path;
 
-		public TempResourceFile(Type type, string name) : this(type, name, name) {}
+		public TempResourceFile(Type type, string name) : this(type, name, null) {}
 
-		public TempResourceFile(Type type, string name, string path)
+		public TempResourceFile(Type type, string name, string filePath)
 		{
-			this.path = path;
-			Stream stream = type.Assembly.GetManifestResourceStream(type, name);
+            if (filePath == null)
+                filePath = name;
+
+            if (!System.IO.Path.IsPathRooted(filePath))
+                filePath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), filePath);
+
+            this.path = filePath;
+
+            Stream stream = type.Assembly.GetManifestResourceStream(type, name);
 			byte[] buffer = new byte[(int)stream.Length];
 			stream.Read(buffer, 0, buffer.Length);
 
-			string dir = System.IO.Path.GetDirectoryName(path);
+			string dir = System.IO.Path.GetDirectoryName(this.path);
 			if(dir != null && dir.Length != 0)
 			{
 				Directory.CreateDirectory(dir);
 			}
 
-			using(FileStream fileStream = new FileStream(path, FileMode.Create))
+			using(FileStream fileStream = new FileStream(this.path, FileMode.Create))
 			{
 				fileStream.Write(buffer, 0, buffer.Length);
 			}
diff --git a/src/tests/test-utilities/TestAssert.cs b/src/tests/test-utilities/TestAssert.cs
index 2468c1c..b6bbd65 100644
--- a/src/tests/test-utilities/TestAssert.cs
+++ b/src/tests/test-utilities/TestAssert.cs
@@ -21,6 +21,7 @@ namespace NUnit.TestUtilities
         public static void IsRunnable(Type type)
         {
             TestSuite suite = TestBuilder.MakeFixture(type);
+            Assert.NotNull(suite, "Unable to construct fixture");
             Assert.AreEqual(RunState.Runnable, suite.RunState);
             TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
             Assert.AreEqual(ResultState.Success, result.ResultState);
@@ -52,7 +53,9 @@ namespace NUnit.TestUtilities
 
         public static void IsNotRunnable(Type type)
         {
-            IsNotRunnable(TestBuilder.MakeFixture(type));
+            TestSuite fixture = TestBuilder.MakeFixture(type);
+            Assert.NotNull(fixture, "Unable to construct fixture");
+            IsNotRunnable(fixture);
         }
 
         public static void IsNotRunnable(Type type, string name)
diff --git a/src/tests/test-utilities/test-utilities.build b/src/tests/test-utilities/test-utilities.build
index 956d4e7..e321252 100644
--- a/src/tests/test-utilities/test-utilities.build
+++ b/src/tests/test-utilities/test-utilities.build
@@ -3,7 +3,7 @@
 
   <patternset id="source-files">
         <include name="FormTester.cs"/>
-        <include name="MockTestEventSource.cs"/>
+        <include name="MockTestEventSource.cs" if="${runtime.version >= '2.0'}"/>
         <include name="TempResourceFile.cs"/>
         <include name="TestAssert.cs"/>
         <include name="TestBuilder.cs"/>
diff --git a/src/tests/test-utilities/test-utilities.csproj b/src/tests/test-utilities/test-utilities.csproj
index 7378bbf..c69aae9 100644
--- a/src/tests/test-utilities/test-utilities.csproj
+++ b/src/tests/test-utilities/test-utilities.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?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>
@@ -29,7 +29,7 @@
     <BaseAddress>285212672</BaseAddress>
     <ConfigurationOverrideFile>
     </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
     <DocumentationFile>
     </DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
diff --git a/src/tests/timing-tests/AssemblyLoadTests.cs b/src/tests/timing-tests/AssemblyLoadTests.cs
deleted file mode 100644
index 9e6468e..0000000
--- a/src/tests/timing-tests/AssemblyLoadTests.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-// ****************************************************************
-// 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;
-using NUnit.Util;
-
-namespace NUnit.Tests.TimingTests
-{
-    [TestFixture]
-    public class LoadTimingTests
-    {
-        private TestRunner runner;
-        private TestLoader loader;
-
-        [TestFixtureSetUp]
-        public void InstallServices()
-        {
-            if (Services.ProjectService == null)
-                ServiceManager.Services.AddService(new ProjectService());
-            if (Services.DomainManager == null)
-                ServiceManager.Services.AddService(new DomainManager());
-        }
-
-        [TearDown]
-        public void UnloadTests()
-        {
-            if (runner != null)
-                runner.Unload();
-            if (loader != null)
-                loader.UnloadProject();
-        }
-
-        [Test]
-        public void Load1000TestsInSameDomain()
-        {
-            runner = new SimpleTestRunner();
-            int start = Environment.TickCount;
-            Assert.IsTrue(runner.Load(new TestPackage("loadtest-assembly.dll")));
-            ITest test = runner.Test;
-            Assert.AreEqual(2050, test.TestCount);
-            int ms = Environment.TickCount - start;
-            Console.WriteLine("Loaded in {0}ms", ms);
-            Assert.LessOrEqual(ms, 4000);
-        }
-
-        [Test]
-        public void Load1000TestsInTestDomain()
-        {
-            runner = new TestDomain();
-            int start = Environment.TickCount;
-            Assert.IsTrue(runner.Load(new TestPackage("loadtest-assembly.dll")));
-            ITest test = runner.Test;
-            Assert.AreEqual(2050, test.TestCount);
-            int ms = Environment.TickCount - start;
-            Console.WriteLine("Loaded in {0}ms", ms);
-            Assert.LessOrEqual(ms, 4000);
-        }
-
-        [Test]
-        public void Load1000TestsUsingTestLoader()
-        {
-            loader = new TestLoader();
-            int start = Environment.TickCount;
-            loader.LoadProject("loadtest-assembly.dll");
-            Assert.IsTrue(loader.IsProjectLoaded);
-            loader.LoadTest();
-            Assert.IsTrue(loader.IsTestLoaded);
-            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
deleted file mode 100644
index 8e310d1..0000000
--- a/src/tests/timing-tests/ClientTimeoutFixture.cs
+++ /dev/null
@@ -1,39 +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
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Threading;
-using NUnit.Framework;
-
-namespace NUnit.Tests.TimingTests
-{
-	/// <summary>
-	/// Summary description for ClientTimeoutFixture.
-	/// </summary>
-	[TestFixture,Explicit]
-	public class ClientTimeoutFixture
-	{
-		// Test using timeout greater than default of five minutes
-		private readonly TimeSpan timeout = TimeSpan.FromMinutes( 6 );
-
-		/// <summary>
-		/// Test that listener is connected after
-		/// a long delay. When run from GUI, this
-		/// tests that TestLoader is connected. 
-		/// When run from console it tests ConsoleUI.
-		/// </summary>
-		[Test]
-		public void ListenerTimeoutTest()
-		{
-            Console.WriteLine( "Sleeping for {0} minutes", timeout.Minutes);
-
-			Thread.Sleep( timeout );
-
-            Console.WriteLine("Waking");
-		}
-	}
-}
diff --git a/src/tests/timing-tests/timing-tests.build b/src/tests/timing-tests/timing-tests.build
deleted file mode 100644
index 2899914..0000000
--- a/src/tests/timing-tests/timing-tests.build
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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.test.dir}/timing-tests.dll">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <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>
-        <patternset refid="source-files"/>
-        <include name="timing-tests.csproj"/>
-        <include name="timing-tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/src/tests/timing-tests/timing-tests.csproj b/src/tests/timing-tests/timing-tests.csproj
deleted file mode 100644
index 29ab2dc..0000000
--- a/src/tests/timing-tests/timing-tests.csproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?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/tools/fit/license.txt b/tools/fit/license.txt
deleted file mode 100644
index af37532..0000000
--- a/tools/fit/license.txt
+++ /dev/null
@@ -1,342 +0,0 @@
-
-
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
\ No newline at end of file
diff --git a/tools/fit/runFile.exe.config b/tools/fit/runFile.exe.config
deleted file mode 100644
index 35909b4..0000000
--- a/tools/fit/runFile.exe.config
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-  <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>
-
-<!--
-     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/tools/src/Gensyntax/App.ico b/tools/src/Gensyntax/App.ico
deleted file mode 100644
index 3a5525f..0000000
Binary files a/tools/src/Gensyntax/App.ico and /dev/null differ
diff --git a/tools/src/Gensyntax/AssemblyInfo.cs b/tools/src/Gensyntax/AssemblyInfo.cs
deleted file mode 100644
index 177a4f0..0000000
--- a/tools/src/Gensyntax/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/tools/src/Gensyntax/CodeGenerator.cs b/tools/src/Gensyntax/CodeGenerator.cs
deleted file mode 100644
index 9d918ad..0000000
--- a/tools/src/Gensyntax/CodeGenerator.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-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
deleted file mode 100644
index 59e1c80..0000000
--- a/tools/src/Gensyntax/GenSpec.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-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
deleted file mode 100644
index 82dc1c1..0000000
--- a/tools/src/Gensyntax/GenSyntax.build
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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
deleted file mode 100644
index 51953da..0000000
--- a/tools/src/Gensyntax/GenSyntax.csproj
+++ /dev/null
@@ -1,142 +0,0 @@
-<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
deleted file mode 100644
index 7afee31..0000000
--- a/tools/src/Gensyntax/GenSyntax.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-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
deleted file mode 100644
index 6b03ba6..0000000
--- a/tools/src/Gensyntax/Program.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-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
deleted file mode 100644
index 4077f96..0000000
--- a/tools/src/Gensyntax/Stanza.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-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
deleted file mode 100644
index e6d983c..0000000
--- a/tools/src/Gensyntax/SyntaxInfo.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-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
deleted file mode 100644
index c987fda..0000000
--- a/tools/src/Gensyntax/Templates/Assert.template.cs
+++ /dev/null
@@ -1,789 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index 0625809..0000000
--- a/tools/src/Gensyntax/Templates/ConstraintExpression.template.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index c376d1c..0000000
--- a/tools/src/Gensyntax/Templates/ConstraintFactory.template.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index 3b6b02b..0000000
--- a/tools/src/Gensyntax/Templates/Default.template.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index 3f59435..0000000
--- a/tools/src/Gensyntax/Templates/Has.template.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index 83763b0..0000000
--- a/tools/src/Gensyntax/Templates/Is.template.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index e02d0be..0000000
--- a/tools/src/Gensyntax/Templates/Text.template.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// ****************************************************************
-// 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
deleted file mode 100644
index c358830..0000000
--- a/tools/src/Gensyntax/Templates/Throws.template.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// ****************************************************************
-// 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